正如前面所说,线程间通信的时候,比如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 对文件的操作模式
  2. 操作系统
  3. android sdcard 相关操作
  4. android 操作剪切板
  5. 网上找了些Android数据库操作的代码
  6. Android设备内存和SD卡操作工具类
  7. Android教程之SQlit数据库操作
  8. Android Logo消息角标数字提醒

随机推荐

  1. Android Material design 之 BottomNavig
  2. Android中MenuInflater的使用(布局文件定
  3. Android STL PORT
  4. 传智播客Android视频教程——第二天
  5. android-edittext
  6. android中SharedPreferences的实例
  7. android中使用MediaRecorder进行视频录制
  8. Android(安卓)学习笔记8——传感器使用
  9. 问题小结(11)-dialog的半透明背景的灰度
  10. ArcGIS Runtime for Android开发教程V2.0