在android中UI线程和子线程之间如何通信呢?如何将子线程执行完的结果数据,发送到Ui线程呢?
Handle的作用正是解决这个问题。每一个Handle对象,必须关联一个线程。Handle 对象是子线程和UI线程数据通信的一个桥梁。
在子程序中发送消息Message,UI线程中的Handle就能接收到该消息。
同样以从网络下载一张图片,显示在本地的ImageView中。
示例代码如下
package com.example.asynctaskproject;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnClickListener {
private Button button;
private ImageView imageview;
private String path = "http://e.hiphotos.baidu.com/image/w%3D2048/sign=db08e76aaf345982c58ae29238cc30ad/f2deb48f8c5494eebcca7c072ff5e0fe98257ec7.jpg";
private ProgressDialog dialog;
private Bitmap bitmap;
private int FINISH_LOAD = 0x01;
//如何接收子线程发送的来的Message
private Handler myhandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
byte[] data = (byte[]) msg.obj;
if (msg.what == FINISH_LOAD) {
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
imageview.setImageBitmap(bitmap);
dialog.dismiss();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
imageview = (ImageView) findViewById(R.id.imageview);
button.setOnClickListener(this);
dialog = new ProgressDialog(this);
dialog.setTitle("下载");
dialog.setMessage("正在下载中.....请稍后");
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button:
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
// 使用网络链接类HttpClient完成网络数据的提取
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(path);
Bitmap bitmap = null;
try {
HttpResponse httpresponse = httpclient.execute(httpget);
if (httpresponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpresponse.getEntity();
byte[] data = EntityUtils.toByteArray(httpEntity);
Message message = Message.obtain();// 以Obtain的方式new出Message对象
message.obj = data;
message.what = FINISH_LOAD;//what值用于标识一个Message
myhandler.sendMessage(message);
//发送方式二
/*Message message2 = Message.obtain(myhandler);
message2.obj=data;
message2.what=FINISH_LOAD;
message2.sendToTarget();*/
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
break;
default:
break;
}
}
}