Android多线程之handler+runOnUithread+view.post+handler.post

Android是基于Java的,所以也分主线程,子线程!
主线程:实现业务逻辑、 UI绘制更新、各子线程串连,类似于将军;
子线程: 完成耗时(联网取数据、SD卡数据加载、后台长时间运行)操作,类似于小兵;
一、子线程向主线程发消息(Thread+handler):
1、主线程中定义Handler:

1.Handler mHandler = new Handler(){ 
2. 
3.    @Override 
4.    public void handleMessage(Message msg) { 
5.        super.handleMessage(msg); 
6.        switch (msg.what) { 
7.        case 0: 
8.            //do something,refresh UI; 
9.            break; 
10.        default: 
11.            break; 
12.        } 
13.    } 
14.     
15.}; 
2、子线程处理完耗时操作之后发消息给主线程,更新UI:

1.mHandler.sendEmptyMessage(0); 
这样在子线程与主线程任务分工的条件下完成了消息交互;

二、主线程向子线程发送消息(Thread+handler):
主线程碰到耗时操作要子线程完成,此时发通知给子线程,操作步骤如下:
1、子线程中定义Handler,Handler定义在哪个线程中,就跟那个线程绑定,在线程中绑定Handler需要调用Looper.prepare();方法,主线程中不调用是因为主线程默认帮你调用了;

1.public class LoopThread implements Runnable { 
2. 
3.    public Handler mHandler = null; 
4. 
5.    @Override 
6.    public void run() { 
7.        Looper.prepare(); 
8.        mHandler = new Handler() { 
9.            public void handleMessage(Message msg) { 
10.                String result = NetUtil.getJsonContent("北京"); 
11.                //完成了获取北京天气的操作; 
12.                Log.i("test", "handler"+result); 
13.            } 
14.        }; 
15.        Looper.loop(); 
16.    } 
17. 
18.} 

其中Looper.prepare();和Looper.loop();维护了一个消息队列,等待消息注入并在子线程中执行;
2、主线程中这样调用:

1.Thread.mHandler.sendEmptyMessage(0);


主线程向子线程发消息,让子线程执行指定的操作,在Android中还有一种方法,即:HandlerThread,看下面的例子:
1.HandlerThread handlerThread = new HandlerThread("jerome"); 
2.handlerThread.start(); 
3. 
4./**
5. * 这里要将HandlerThread创建的looper传递给threadHandler,即完成绑定;
6. */ 
7.threadHandler = new Handler(handlerThread.getLooper()) { 
8. 
9.    @Override 
10.    public void handleMessage(Message msg) { 
11.        super.handleMessage(msg); 
12.        switch (msg.what) { 
13.        case 0: 
14.这儿可以做耗时的操作; 
15.            Log.i("jerome", "hello,I am sub thread"); 
16.            break; 
17.        default: 
18.            break; 
19.        } 
20.    } 
21.}; 


三,android中handler.post();和view.post();?
android中handler.post();和view.post();方法可以用来刷新ui线程我看了下源码,发现view.post()方法内会创建一个handler,并调用handler.post()用view.post在代码编写上会省事,不用自己去new handler

Android的线程分UI线程与非UI线程两类。

而Handler是非UI线程向UI线程传递消息的桥梁。除了非常常用sendMessage之外,Handler也提供了post(Runnable...),postDelayed等
风骚犀利的方法,利于我们使用“闭包式编程”。

View作为UI的一部分,也无例外的提供了一个淫荡的View.post(Runnable)方法,让我们在UI线程中doSomeThing。灵活使用View.post。神马Handler,Activity.runOnUIThread,
都可以一边站去。

相同
在与UI线程的通信上,Handler与View,其实最终都做了同样的事情。就是将消息传递在UI线程的消息队列里,执行一些处理操作。

new handler 与  view.post()的区别是   ?
前面是你自己创建、后面是view的内部帮你完成
handler和AsyncTask分别在哪种情况下用?用哪个好?
AsyncTask 分前台任务和后台任务, 后台任务是通过线程池实现的。它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
handler 处理方式很单一, 就是个消息处理. 处理线程是调用loop()方法。使用handler会代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。

handle是主线程 ,Thread是从线程。控件数据更改只能在主线程 里,所以要用handle.更新UI只能在主线程里进行,否则会报错。但有时我们在子线程里进行操作需要更新UI,handler就登场了,它可以把子线程的数据传给主线程,让主线程同步操作来更新UI。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值