Android(安卓)Looper And Hander 机制剖析 - 03
16lz
2021-01-26
上一篇中使用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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/start" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="start"/></RelativeLayout>3.分析
在点击start之后,首先创建一个HandlerThread对象,然后获取looper(其实就是类似scheduler的东西),作为参数传递给MyHandler(一个继承自Handler的类)。我们想传递参数给任务,这时候我们需要Bundle对象(类似Map),MyHandler实例的Message属性就是保存参数对象的,所以使用setData就可以传递参数进去。
MyHandler重写了HandleMessage的方法,顾名思义就是处理Message的,所以在这里,我们可以使用Bundle类来获取参数,然后取出来。
4.效果
更多相关文章
- 发邮件
- android之绘图工具类详解
- Android(安卓)面试准备进行曲 (Android基础进阶 一 )v1.2
- Android(安卓)原生webview传递header前端H5如何接收
- [Android] 查看Android中的AlarmManager事件
- Android(安卓)从源码的角度分析——为什么要用newInstance来实例
- Android(安卓)NFC P2P学习2 - Service层
- Android(安卓)三种动画详解及简单实例
- 【android】handler.post方法的说明和注意事项