handle与多线程

handle的post的方法:

Post

  对于Handler的Post方式来说,它会传递一个Runnable对象到消息队列中,在这个Runnable对象中,重写run()方法。一般在这个run()方法中写入需要在UI线程上的操作。

  在Handler中,关于Post方式的方法有:

  • boolean post(Runnable r):把一个Runnable入队到消息队列中,UI线程从消息队列中取出这个对象后,立即执行。
  • boolean postAtTime(Runnable r,long uptimeMillis):把一个Runnable入队到消息队列中,UI线程从消息队列中取出这个对象后,在特定的时间执行。
  • boolean postDelayed(Runnable r,long delayMillis):把一个Runnable入队到消息队列中,UI线程从消息队列中取出这个对象后,延迟delayMills秒执行
  • void removeCallbacks(Runnable r):从消息队列中移除一个Runnable对象。

   下面通过一个Demo,讲解如何通过Handler的post方式在新启动的线程中修改UI组件的属性

一开始,相信很多人都以为myThread中的run()方法会在一个新的线程中运行,但事实并非如此。以下代码中的handler并没有调用线程myThread的start()方法,而是直接调用了run()方法,这也就意味着实际上并没有创建一个新的线程,只是在当前线程中调用run()方法而已,

下面是一段大家都比较熟悉的代码:

复制代码代码如下:

Handler handler = new Handler(); 
handler.post(myThread);


//使用匿名内部类创建一个线程myThread
Runnable mythread = new Runnable() {
public void run() {
}
};


一开始,相信很多人都以为myThread中的run()方法会在一个新的线程中运行,但事实并非如此。

上述代码中的handler并没有调用线程myThread的start()方法,而是直接调用了run()方法,这也就意味着实际上并没有创建一个新的线程,只是在当前线程中调用run()方法而已。

这牵扯出一个问题,如果我们将一个很耗时的操作放到了run()方法内,然后使用一个Handler对象将该线程post到线程队列。原本我们希望将这些耗时操作放到另外一个线程中,以免影响当前进程。但实际上却恰恰相反:post()以下的那些代码必须等到run()方法执行完毕后才能继续执行。如当前线程为主线程,那么主程序便会处于硬直状态。


如果有一个耗时的操作,必须另起有一个线程,同时又可以用handle。可以用 HandlerThread

一种最简便的方法就是直接利用JAVA中的实现多线程的方法,即建立一个Thread对象,然后调用start()方法。

还有另外一种方法,代码如下:

复制代码 代码如下:

//HandlerThread建立了一个新线程,它包含一个Looper
HandlerThread handlerThread = new HandlerThread("handler_Thread");
handlerThread.start();//启动一个线程
MyHandler myHandler = new MyHandler(handlerThread.getLooper());//使用新线程的Looper建立一个Handler
//此时MyHandler便与一个新线程绑定到一起了

Message msg = myHandler.obtainMessage();
msg.sendToTarget();//将message压入提供message的Handler的消息队列中

//建立一个Handler的子类
class MyHandler extends Handler {
MyHandler(Looper looper) {
super(looper);
}
public void handleMessaage(Message msg) {
//处理消息的代码
}
}


今天我又仔细的看了一下Android文档,发现android虽然支持上两种建立线程的方法,但是它有一个规则:

原文是:it violates the second rule of the single-threaded model: do not access the Android UI toolKit from outside the UI thread.

大概意思就是:Android不支持在UI线程以外的线程中修改UI控件。比如给一个Textview设置文字,这样的操作便不能放在UI线程以外的线程内执行,否则便会出现异常。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值