Thread-Looper-Thread 阶段一
来源:互联网 发布:centos bugzilla安装 编辑:程序博客网 时间:2024/06/04 19:02
1.在Activity中如果new一个无参的Handler对象,那么这个Handler将自动与当前运行线程相关联,也就是说这个Handler将与当前运行的线程使用同一个消息队列,并且可以处理该队列中的消息。
private Handler handler =new Handler();
public class MainActivity extends Activity {private String TAG = "main";private Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Log.d(TAG, "mainActivity:" + Thread.currentThread().getId());handler.post(r);}Runnable r = new Runnable() {@Overridepublic void run() {try {Thread.sleep(2000);Log.d(TAG, "runnable:" + Thread.currentThread().getId());} catch (InterruptedException e) {e.printStackTrace();}}};}
输出结果:
01-04 14:24:12.716: DEBUG/main(12490): mainActivity:101-04 14:24:14.758: DEBUG/main(12490): runnable:1
通过输出结果可以发现,Runnable对象和主用户界面线程的ID是相同。在这个例子中,我们直接利用handler对象post了一个runnable对象,相当于直接调用了Runnable对象的run函数,也就说没有经过start函数调用run(),那么就不会创建一个新线程,而是在原有线程内部直接调用run()方法,因此输出的线程Id是相同的。
2.如果new一个带参构造函数的Handler对象,那么这个Handler对象将与参数所表示的Looper相关联(摘抄百度)
privateMyHandlermyhandler =newMyHandler(thread.getLooper());
public class HandlerTest2 extends Activity {private MyHandler myhandler = null;private String TAG = "main";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.main);Log.d(TAG, "main:" + Thread.currentThread().getId());HandlerThread thread = new HandlerThread("MyThread");thread.start();myhandler = new MyHandler(thread.getLooper());Message msg = myhandler.obtainMessage();msg.sendToTarget();}class MyHandler extends Handler {public MyHandler() {}public MyHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {Log.d(TAG, "handler:" + Thread.currentThread().getId());}}}
输出结果
01-04 14:33:42.753: DEBUG/main(12561): main:101-04 14:33:42.753: DEBUG/main(12561): handler:10
根据输出结果,可以看出,新线程Id与主用户界面的线程Id不同。由于我们调用了thread.start()方法,真正的创建了一个新线程,与原来的线程处于不同的线程上下文中,因此打印输出的线程Id是不同的。同时,MyHandler与HandlerThread 使用的是同一个线程池
3.主线程与子线程- 主线程looper声明的无参数的Handler对讲,刷新界面
public class HandlerTest3 extends Activity {private String TAG = "main";@SuppressLint("HandlerLeak")private Handler myhandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// do something - 刷新uiLog.d(TAG, "handler:" + Thread.currentThread().getId());super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.main);Log.d(TAG, "main:" + Thread.currentThread().getId());myhandler.sendEmptyMessage(0);new MyThrad().start();}private class MyThrad extends Thread {@Overridepublic void run() {super.run();try {Log.d(TAG, "thread:" + Thread.currentThread().getId());Thread.sleep(1000);// do something - 耗时操作} catch (InterruptedException e) {e.printStackTrace();}}}}
输出结果
01-04 14:47:11.762: DEBUG/main(12662): main:1
01-04 14:47:11.772: DEBUG/main(12662): thread:10
01-04 14:47:11.772: DEBUG/main(12662): handler:1
根据输出结果,可以看出,主线程Id与子线程Id不同,但是主线程与handler中的线程id一样即:主线程与handler 使用同一个线程池,looper绑定 子线程是一个
0 0
- Thread-Looper-Thread 阶段一
- Thread-join 阶段一
- 理解Handler、Looper、MessageQueue、Thread关系?一
- Android 复习 总结一:handler thread looper
- Handler Thread Looper
- Handler Thread looper
- Thread with Looper
- Thread Looper Handler
- Thread, Looper, Handler
- Handler Thread Looper小结
- Android 中消息处理机制-Looper、Handler、Thread(一)
- Android多线程消息处理机制(一) Looper、Thread专题
- Android 中消息处理机制-Looper、Handler、Thread(一)
- Thread(一)
- Thread (一)
- android handler, thread and looper
- Android Thread Looper Handler 关系
- Thread,looper,handler,message相关
- RTEMS 4.11 工具链安装
- centOS 6.5 的安装和配置
- 高字节序 & 地字节序
- PHP 计算数组的维数
- 25个非常实用的jQuery/CSS3应用组件
- Thread-Looper-Thread 阶段一
- C/C++返回内部静态成员的陷阱(inet_ntoa)
- CentOS6.4下Mysql数据库的安装与配置
- malloc/free与new/delete的区别
- 12306网站前端初步优化之我见
- 用 git config 配置用户信息
- Cloud Foundry 研究之三 ---快速启动克隆版(脚本篇)
- shell细节分析
- 图像处理:基础(模板、卷积运算)