正如前面所说,线程间通信的时候,比如Android中常见的更新UI,涉及到的是子线程和主线程之间的通信,实现方式就是Handler+Looper,但是要自己手动操作Looper,不推荐,所以谷歌封装了HandlerThread类(类似于AsyncTask类)。

上代码,具体实现:

public class MainActivity extends AppCompatActivity {     Handler mainHandler,workHandler;    HandlerThread mHandlerThread;    TextView text;    Button button1,button2;     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text = (TextView) findViewById(R.id.text1);         // 创建与主线程关联的Handler        mainHandler = new Handler();        /**          * 步骤①:创建HandlerThread实例对象          * 传入参数 = 线程名字,作用 = 标记该线程          */        mHandlerThread = new HandlerThread("handlerThread");         /**         * 步骤②:启动线程         */        mHandlerThread.start();         /**         * 步骤③:创建工作线程Handler & 复写handleMessage()         * 作用:关联HandlerThread的Looper对象、实现消息处理操作 & 与其他线程进行通信         * 注:消息处理操作(HandlerMessage())的执行线程 = mHandlerThread所创建的工作线程中执行         */         workHandler = new Handler(mHandlerThread.getLooper()){            @Override            public void handleMessage(Message msg)            {                //设置了两种消息处理操作,通过msg来进行识别                switch(msg.what){                    case 1:                        try {                            //延时操作                            Thread.sleep(1000);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                        // 通过主线程Handler.post方法进行在主线程的UI更新操作                        mainHandler.post(new Runnable() {                            @Override                            public void run () {                                text.setText("第一次执行");                            }                        });                        break;                    case 2:                        try {                            Thread.sleep(3000);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                        mainHandler.post(new Runnable() {                            @Override                            public void run () {                                text.setText("第二次执行");                            }                        });                        break;                    default:                        break;                }            }        };         /**         * 步骤④:使用工作线程Handler向工作线程的消息队列发送消息         * 在工作线程中,当消息循环时取出对应消息 & 在工作线程执行相关操作         */        button1 = (Button) findViewById(R.id.button1);        button1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Message msg = Message.obtain();                msg.what = 1; //消息的标识                msg.obj = "A"; // 消息的存放                // 通过Handler发送消息到其绑定的消息队列                workHandler.sendMessage(msg);            }        });         button2 = (Button) findViewById(R.id.button2);        button2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Message msg = Message.obtain();                msg.what = 2;                 msg.obj = "B";                 workHandler.sendMessage(msg);            }        });     }        @Override    protected void onDestroy() {        super.onDestroy();        mHandlerThread.quit(); // 退出消息循环        workHandler.removeCallbacks(null); // 防止Handler内存泄露 清空消息队列    }}

代码中我们可以看到,点击事件之后,workHandler 接收到消息后在 mHandlerThread 线程中执行了耗时操作,最后更新UI 则通过主线程的 mainHandler 来执行

更多相关文章

  1. Android(安卓)layer type与WebView白屏
  2. Android: 如何利用Handler、Thread更新视图
  3. 零打碎敲学Android(一)—用什么来替代Graphics
  4. ContentProvider和Uri详解
  5. Android提供了5种方式存储数据:
  6. Android(安卓)利用url获取Bitmap图片
  7. Android开发面试经——4.常见Android进阶笔试题(更新中...)
  8. android中的Handler(2)
  9. Bluetooth in Android(安卓)4.2 and 4.3(三):Enable Bluetooth

随机推荐

  1. 关于Android四大基本组件介绍与生命周期
  2. Android native/C/C++ 监控文件夹变化
  3. Android开发环境建立2
  4. android绘画折线图一
  5. Android(安卓)jdk1.8的使用配置并解决中
  6. Android组件化方案
  7. Android修改system只读权限
  8. RelativeLayout常用布局属性
  9. Android中使用Build获取当前系统SDK版本
  10. 【Android API】Android 4.1 API官方文档