Handler 和Message(一)
/**
* android3.0以后不允许在主线程访问网络,可用线程来处理
* @author YangQuanqing
*
*/
public class MainActivity extends Activity {
private Button btn=null;
private ImageView image=null;
private String image_path="http://f2.sjbly.cn/m13/0729/1459/6947edn_690x459_b.jpg";
private Bitmap bitmap=null;
private ProgressDialog dialog=null;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//获得数据
byte[]data=(byte[]) msg.obj;
//数据解码
bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);
//显示
image.setImageBitmap(bitmap);
if(msg.what==0x123)
{
dialog.dismiss();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)this.findViewById(R.id.button1);
image=(ImageView)this.findViewById(R.id.imageView1);
dialog=new ProgressDialog(this);
dialog.setTitle("提示信息");
dialog.setMessage("下载中,请稍候......");
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
//启动实现接口的线程
new Thread(new MyThread()).start();
dialog.show();
//image.setImageBitmap(bitmap);
}
});
}
class MyThread implements Runnable{
//该线程完成下载耗时操作
@Override
public void run() {
//获得访问网络资源的HttpClient实例
HttpClient httpClient=new DefaultHttpClient();
//设置访问网络资源的请求方式
HttpGet httpGet=new HttpGet(image_path);
InputStream in=null;
ByteArrayOutputStream out=new ByteArrayOutputStream();
HttpEntity httpEntity=null;
try {
//执行请求获得响应
HttpResponse httpResponse=httpClient.execute(httpGet);
//判断请求是否成功
if(httpResponse.getStatusLine().getStatusCode()==200)
{
//请求响应成功
//获得输入流
httpEntity=httpResponse.getEntity();
///////////////////////////////////////
//方式1
//获得输入流
//in=httpResponse.getEntity().getContent();
/*//把输入流写入内存流里
int len=0;
byte[] buffer=new byte[1024];
while((len=in.read(buffer))!=-1)
{
out.write(buffer, 0, len);
}
byte[] data=out.toByteArray();
*/
///////////////////////////////////////
//方式2转换成字节数组
byte[] data=EntityUtils.toByteArray(httpEntity);
//通过Message类把子线程的数据带给主线程
//获得Message对象
Message message=Message.obtain();
//消息携带数据
message.obj=data;
//判断是否结束
message.what=0x123;
//子线程发送消息给主线程的Handler类处理
handler.sendMessage(message);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}}
Handler 和Message(二)
/**
* obtain()方法可以传Message的参数但必须要设置目标msg.sendToTarget();
* @author YangQuanqing yqq
*
*/
public class MainActivity extends Activity {
private Button btn=null;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg);
System.out.println(msg.arg1);
System.out.println(msg.arg2);
System.out.println(msg.obj);
System.out.println(msg.what);
//获得bundle对象
Bundle data=msg.getData();
System.out.println(data.getStringArray("mang_str").length);
Log.i("Handler_Message<<<",msg.arg1+"");
Log.i("Handler_Message<<<",msg.arg2+"");
Log.i("Handler_Message<<<",msg.obj+"");
Log.i("Handler_Message<<<",msg.what+"");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)this.findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
//启动子线程
new Thread(new MyThread()).start();
}
});
}
public class MyThread implements Runnable{
@Override
public void run() {
//第一种方式
////获得Message对象
//Message msg=Message.obtain();
////给消息添加数据
//msg.arg1=1;
//msg.arg2=2;
//msg.obj="android";
//msg.what=12306;
//handler.sendMessage(msg);
//第二种方式
//Message msg=Message.obtain(handler);
////给消息添加数据
//msg.arg1=1;
//msg.arg2=2;
//msg.obj="android";
//msg.what=12306;
//msg.sendToTarget();
//第三种方式
Message msg=Message.obtain(handler,999);
//给消息添加数据
msg.arg1=11;
msg.arg2=22;
msg.obj="android123";
//复杂数据类型
Bundle data=new Bundle();
data.putStringArray("mang_str", new String[]{"aaa","bbb","ccc"});
msg.setData(data);
msg.sendToTarget();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Handler和Message
public class MainActivity extends Activity implements OnClickListener {
private Button postBtn=null;
private Button sendBtn=null;
//接收或者发送消息 从消息队列中提取消息用于更新UI操作
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
Log.i("<<<<<<<<what", msg.what+"");
Log.i("<<<<<<<<arg1", msg.arg1+"");
Log.i("<<<<<<<<arg2", msg.arg2+"");
Log.i("<<<<<<<<object", msg.obj+"");
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendBtn=(Button)this.findViewById(R.id.button1);
sendBtn.setOnClickListener(this);
postBtn=(Button)this.findViewById(R.id.button2);
postBtn.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.button1:
//新起一个线程
new Thread(new Runnable(){
@Override
public void run() {
//方式一what值
//handler.sendEmptyMessage(12306);
//方式二 what值
//handler.sendEmptyMessageAtTime(222, 500);
//方式三延时 what值
//handler.sendEmptyMessageDelayed(33311, 10000);
//方式四
//Message msg=Message.obtain();
//msg.what=10086;
//方式五
Message msg=handler.obtainMessage(10086,10088, 10090,"android");
handler.sendMessage(msg);
}
}).start();
break;
case R.id.button2:
boolean flag=handler.post(new Runnable(){
@Override
public void run() {
Message msg=handler.obtainMessage(1,88, 90,"android and java");
}
});
Log.i("<<<<",flag+"");
break;
}
}
}