上一篇中使用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.效果




更多相关文章

  1. 发邮件
  2. android之绘图工具类详解
  3. Android(安卓)面试准备进行曲 (Android基础进阶 一 )v1.2
  4. Android(安卓)原生webview传递header前端H5如何接收
  5. [Android] 查看Android中的AlarmManager事件
  6. Android(安卓)从源码的角度分析——为什么要用newInstance来实例
  7. Android(安卓)NFC P2P学习2 - Service层
  8. Android(安卓)三种动画详解及简单实例
  9. 【android】handler.post方法的说明和注意事项

随机推荐

  1. 2011年Android(安卓)Binder机制学习笔记
  2. Android如何检测输入法键盘是否显示
  3. [置顶] Android SDK中的例子的源代码
  4. android自定义视图属性(atts.xml,TypedArr
  5. Android 自定义Listview 如何绑定Sqlite
  6. Android设置系统开机自动永不休眠
  7. Android怎样添加AT命令
  8. 【Android】进程通信IPC——ContentProvi
  9. Android Studio中图片的格式转换
  10. 基于xmpp openfire smack开发之Android消