Handler详解

Handler

主要用于异步消息的处理,发送消息和接收消息不是同时的,主要用于处理耗时比较长的代码,开始,首先介绍一下Handler的基本使用方法:

 

这里主要 用了匿名内部类的方法,构建了一个Handler对象和Runnable对象,handler里面有一个方法: public void handleMessage(Message msg) 主要用来获得Message对象,需要注意的是,Handler里面一共有两个对列,一个是消息队列,另一个是线程队列,在Runnable对象重写run方法里面,先获得了Message对象,接着为他赋值,然后停留一秒,将Message压入到消息对列,Handler获得消息后,显示在bar上,然后再将线程压入队列,知道i==100时,将线程从线程从线程队列中弹出,这是最简单的用法。

整体代码如下:

public class MainActivity extends Activity {
    ProgressBar bar = null;
    Button startBt = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        bar = (ProgressBar) findViewById(R.id.bar);
        startBt = (Button) findViewById(R.id.my_bt);
        startBt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                bar.setVisibility(View.VISIBLE);
                myHandler.post(runnableThread);
            }
        });
    }
         Handler myHandler  = new Handler(){
            @Override
            //异步的,获得Message
            public void handleMessage(Message msg) {
                bar.setProgress(msg.arg1);
                //将线程压入到线程队列中
                myHandler.post(runnableThread);

            }
        };
         Runnable runnableThread = new Runnable() {
            int i = 0;
            @Override
            public void run() {
                i = i + 10;
                //得到handlerMessage
                Message msg = myHandler.obtainMessage();
                //msgarg1值设置为i
                msg.arg1 = i;
                try {
                   Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                //只管将消息压入到消息对列中
                myHandler.sendMessage(msg);
                if(i == 100) {
                    //将线程从线程队列中弹出
                    myHandler.removeCallbacks(runnableThread);
                }
            }
        };
}

 

注意:handlerPost方法没有开启新的线程是直接在原有的线程上调用了run方法,并没有调用它的start方法。

 

Bundle:所有的键都是String类型的,其值可以为其他的类型(不是Object),可以将其看成特殊的map,作为数据存储的工具。

 

HandlerThread可以循环处理消息,它另开了一个线程,真正的实现了异步处理。

 

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        HandlerThread handlerThread = new HandlerThread("handler_thread");
        handlerThread.start();
        //在使用handlerThread.getLooper()方法之前,必须先调用handlerThreadstart方法。
        MyHandler myHandler = new MyHandler(handlerThread.getLooper());
        Message msg = myHandler.obtainMessage();
        //作为存储对象
        Bundle  bundle = new Bundle();
        bundle.putString("name","yanxi");
        bundle.putInt("age",16);
        msg.setData(bundle);
        //msg发送到目标对象,所谓的目标对象,就是生成msgHandler对象
        msg.sendToTarget();
    }
    private class MyHandler extends Handler{
        public MyHandler(Looper looper) {
            super(looper);
        }
        @Override
        public void handleMessage(Message msg) {
            System.out.println("handler-->"+Thread.currentThread().getId());
            Bundle b = msg.getData();
            String name = b.getString("name");
            int age = b.getInt("age");
           System.out.println(name + age);
        }
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值