Android之Handler在新线程中处理消息
来源:互联网 发布:航空霸业2飞机数据 编辑:程序博客网 时间:2024/06/07 10:23
在上一篇博客中介绍了利用post方法将线程添加到handler消息队列其实是和主线程在同一线程中运行的,如果这一线程是一个耗时操作的话主线程会等这个线程的run方法运行之后才会继续进行下面的操作,而此时主线程可以理解为处于假死状态,用户可能会理解为挂掉了,这样的情况肯定是万万不能出现的,那么怎么解决这一问题呢。
第一种方法就是不调用handler的post方法,而是像我们原来在java中实现多线程方法一样,创建一个Thread,然后调用start方法。
第二种方法就是利用android开发框架中的looper类来实现:
首先创建一个HandlerThread新线程并调用start方法:
HandlerThread handlerThread = new HandlerThread("handler_thread"); handlerThread.start();
将handlerThread的looper作为参数绑定到一个继承handler的子类线程中:
MyHandler myHandler = new MyHandler(handlerThread.getLooper()); class MyHandler extends Handler{ public MyHandler(){ } public MyHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ } }
在handlerMessage方法中处理消息。
在实例中:
package cn.android.handler;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Looper;import android.os.Message;import android.util.Log;public class HandlerTestActivity extends Activity { /** Called when the activity is first created. */ private static final String SWORD="SWORD"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //打印当前线程ID Log.i(SWORD,"Activity--->"+Thread.currentThread().getId()); //生成一个HandlerThread对象,实现了使用Looper来处理消息队列 HandlerThread handlerThread = new HandlerThread("handler_thread"); //在使用HandlerThread的getLooper()方法之前,必须先调用该类的start()方法启动线程 handlerThread.start(); MyHandler myHandler = new MyHandler(handlerThread.getLooper()); Message msg = myHandler.obtainMessage(); //将msg发送到目标对象,所谓的目标对象,就是生成该msg对象的handler对象 Bundle b = new Bundle(); b.putInt("age", 20); b.putString("name", "Jhon"); msg.setData(b); //发送消息对象 msg.sendToTarget(); } class MyHandler extends Handler{ public MyHandler(){ } public MyHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ Bundle b = msg.getData(); int age = b.getInt("age"); String name = b.getString("name"); Log.i(SWORD,"age--"+age+" name---"+name); Log.i(SWORD,"handlerId"+Thread.currentThread().getId()); Log.i(SWORD,"handlerMessage"); } } }
运行并查看日志输出结果:
- Android之Handler在新线程中处理消息
- Android之Handler在新线程中处理消息
- Android之Handler在新线程中处理消息
- Android之Handler在新线程中处理消息
- Android Handler在新线程中处理消息
- Android学习—— Handler 的消息发送,在新的线程处理消息
- Android Handler/Looper/MessageQueue 在新线程中使用Handler
- Android:在子线程中更新UI,解析异步消息处理机制(Handler)
- Android异步消息处理线程之----Looper+MessageQueue+Handler
- #Android笔记#线程与消息处理之Handler
- Android之多线程----异步消息处理机制之Handler详解
- android消息处理之Handler
- 下面的程序实现了在利用Handler在新线程当中处理消息的方法
- Android之Handler在新线程中读取网络的两种方法
- Android之Handler在新线程中读取网络的两种方法
- HandlerThread,子线程中处理Handler消息
- 【Android开发】线程与消息处理-Handler消息传递机制之Looper
- android线程消息机制之Handler详情
- 每周一句话
- 回老家去?
- 5、linux进程间通信之管道通信
- 虚电路和数据报的区别以及应用
- 傅立叶变换网文精粹:傅立叶变换的物理意义
- Android之Handler在新线程中处理消息
- 指针和二维数组
- 6、linux进程间通信之信号通信
- 文件操作
- 黑马程序员-集合一些事
- OpenCV学习笔记(四十四)——初探GPU
- 关于apk安装时,Packagepaser报错: <provider> does not incude authorities attribute
- 编译v8解析器时注意的问题
- 团队合作中如何写出高效整洁规范的CSS代码