8、深入理解Looper、Handler、Message

1、Looper。

Looper用来给一个线程加一个消息队列(MessageQueue),然后循环从这个消息队列读取Message消息。

Looper的主要方法:
  • public static prepare();
  • public static myLooper();
  • public static loop();
  • public void quit();
Looper的使用过程:

(a)Looper.prepare(),线程初始化消息队列。
(b)Looper.myLooper(),获取Looper对象,一个线程只能有一个Looper对象,一个Looper也只有一个MessageQueue。
(c)使用Handler处理消息内容。
(d)Looper.loop(),循环接收消息。
(e)Looper.quit(),退出消息循环。

2、Handler。

Handler主要是往MessageQueue中发送消息,和自己处理消息的功能,整个过程是异步的。

一个线程可以有多个Handler,Handler发送消息的方法:
post(Runnable)
postAtTime(Runnable, long)
postDelayed(Runnable, long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message, long)
sendMessageDelayed(Message, long)

3、Looper、Handler与Message的关系。

这里写图片描述

4、使用步骤:

实例化Looper(因为实例化Handler时需要一个looper);
实例化Handler,这里需要覆盖handleMessage方法,处理收到的消息;
实例化Message对象,调用已经实例化好的handler对象的obtainMessage方法,把数据传给obtainMessage方法,obtainMessage方法就会实例化一个Message对象。(这里也可以发送实现Runnable接口的对象);
调用Handler的sendMessage方法把实例化好的Message对象发送出去。

5、一个实例。

package com.bgxt.datatimepickerdemo;

import org.apache.http.HttpResponse;
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.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class HandlerMessageActivity1 extends Activity {
private Button btnDown;
private ImageView ivImage;
private static String image_path = "http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg";
private ProgressDialog dialog;
private static int IS_FINISH = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.asynctask_activity);

    btnDown = (Button) findViewById(R.id.btnDown);
    ivImage = (ImageView) findViewById(R.id.ivSinaImage);

    dialog = new ProgressDialog(this);
    dialog.setTitle("提示信息");
    dialog.setMessage("正在下载,请稍后...");
    dialog.setCancelable(false);

    btnDown.setOnClickListener(new View.OnClickListener() {
        @Override
         public void onClick(View v) {
            new Thread(new MyThread()).start();
            dialog.show();
        }
    });
}

private Handler handler = new Handler() {
    // 在Handler中获取消息,重写handleMessage()方法
    @Override
    public void handleMessage(Message msg) { 
        // 判断消息码是否为1
        if(msg.what==IS_FINISH){
            byte[] data=(byte[])msg.obj;
            Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length);
            ivImage.setImageBitmap(bmp);
            dialog.dismiss();
        }
    }
};

public class MyThread implements Runnable {

    @Override
    public void run() {
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(image_path);
        HttpResponse httpResponse = null;
        try {
            httpResponse = httpClient.execute(httpGet);
            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                byte[] data = EntityUtils.toByteArray(httpResponse.getEntity());
                // 获取一个Message对象,设置what为1
                Message msg = Message.obtain();
                msg.obj = data;
                msg.what = IS_FINISH;
                // 发送这个消息到消息队列中
                handler.sendMessage(msg);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值