本文共 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.效果