博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Looper And Hander 机制剖析 - 03
阅读量:2235 次
发布时间:2019-05-09

本文共 3018 字,大约阅读时间需要 10 分钟。

上一篇中使用Thread和Runnable实现了后台线程处理任务的机制,但实际情况下,我们遇到的情形比这个复杂,比如传递对象参数。这一篇就谈论下如何正确使用Handler机制使用后台线程处理任务并传递参数。

1.MainActivity

import com.example.handler1.R;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.os.HandlerThread;import android.os.Looper;import android.os.Message;public class MainActivity extends Activity {	private Button start = null;		@Override	protected void onCreate(Bundle savedInstanceState) {		// TODO Auto-generated method stub		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main2);				start = (Button)findViewById(R.id.start);		start.setOnClickListener(new StartOnClickListenr());	}		final class MyHandler extends Handler{        //空的构造函数        public MyHandler(){        	        }        //以Looper类型参数传递的函数,Looper为消息泵,不断循环的从消息队列中得到消息并处理,因此        //每个消息队列都有一个Looper,因为Looper是已经封装好了的消息队列和消息循环的类        public MyHandler(Looper looper){            //调用父类的构造函数            super(looper);        }        @Override        public void handleMessage(Message msg) {            // TODO Auto-generated method stub            System.out.println("Handler_ID---->"+Thread.currentThread().getId());            System.out.println("Handler_Name---->"+Thread.currentThread().getName());            //将消息中的bundle数据取出来            Bundle b = msg.getData();            String city = b.getString("city");            String whether = b.getString("whether");            int temperature = b.getInt("temperature");            System.out.println("city=" + city + ",whether= " +             		whether +" ,temperature= "+temperature);        }    }		private class StartOnClickListenr implements OnClickListener{        public void onClick(View v) {        	System.out.println("Handler_ID---->"+Thread.currentThread().getId());            System.out.println("Handler_Name---->"+Thread.currentThread().getName());            //新建一个HanderThread对象,该对象实现了用Looper来处理消息队列的功能            HandlerThread handlerThread = new HandlerThread("handlerThread");            handlerThread.start();            //MyHandler类是自己继承的一个类,这里采用hand_thread的Looper来初始化它            MyHandler myHandler = new MyHandler(handlerThread.getLooper());            //获得一个消息msg            Message msg = myHandler.obtainMessage();            //采用Bundle保存数据,Bundle中存放的是键值对的map,只是它的键值类型和数据类型比较固定而已            Bundle b = new Bundle();            b.putString("city", "shanghai");            b.putString("whether", "Sunny");            b.putInt("temperature", 38);            msg.setData(b);            //将msg发送到自己的handler中,这里指的是my_handler,调用该handler的HandleMessage方法来处理该msg            msg.sendToTarget();        }    }}
2.layout

3.分析

在点击start之后,首先创建一个HandlerThread对象,然后获取looper(其实就是类似scheduler的东西),作为参数传递给MyHandler(一个继承自Handler的类)。我们想传递参数给任务,这时候我们需要Bundle对象(类似Map),MyHandler实例的Message属性就是保存参数对象的,所以使用setData就可以传递参数进去。

MyHandler重写了HandleMessage的方法,顾名思义就是处理Message的,所以在这里,我们可以使用Bundle类来获取参数,然后取出来。

4.效果

你可能感兴趣的文章
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Loadrunner】性能测试报告实战
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>
【雅思】【大作文】【审题作业】关于同不同意的审题作业(重点)
查看>>
【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>
【托业】【新东方全真模拟】03~04-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST05~06-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST09~10-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST07~08-----P5~6
查看>>
solver及其配置
查看>>