Handle的用法

在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;
		}

	}

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值