精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-04-26
弄错一个概念:Android的Thread与Handler是不同的!
一直以为Android中Handler的post方法会创建一个线程,一直都是这样编程过来,也没发现什么问题,
最近在编一个对线程要求很高的一个程序时,发现机器反应特别缓慢,一直找不到问题所在,
最后实在没办法用Thread代替Handler来创建线程,问题解决了...
原来一直是我的概念出现了问题,Handler并不是Android为新建线程而设立的方法,Handler其实是用来对控件进行异步刷新的方法。
对我的无知进行一个记录。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-04-27
唉 又见小白了。。。。 Handler的主要作用是能够让handler所在的线程以队列的形式去执行runnable,而且是异步的 你的handler new在主线程里,而主线程里面执行的东西很多所以导致很卡 如果你的handler new在新的线程里就不会出现这种问题。
public class RunInOtherThread { private static final String LOG_TAG = "RunInOtherThread"; LooperThread localThread = new LooperThread(); public RunInOtherThread(){ localThread.start(); } public Handler getHandler(){ return localThread.getHandler(); } private class LooperThread extends Thread { private Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { onReceiveMessage(msg.what); } }; Looper.loop(); } Handler getHandler(){ return mHandler; } } public void sendMessage(int what){ getHandler().sendEmptyMessage(what); } public void onReceiveMessage(int what){}; }
|
|
返回顶楼 | |
发表时间:2012-04-27
受教了,还有很多需要学习的地方。
|
|
返回顶楼 | |
发表时间:2012-04-30
那你以前做的程序打算怎办 ?
|
|
返回顶楼 | |
发表时间:2012-05-01
endual 写道 那你以前做的程序打算怎办 ?
能重写就重写。 |
|
返回顶楼 | |
发表时间:2012-05-02
不然怎么会有handler+thread异步这么一说呢?
|
|
返回顶楼 | |
发表时间:2012-05-04
Cindy_Lee 写道
唉 又见小白了。。。。 Handler的主要作用是能够让handler所在的线程以队列的形式去执行runnable,而且是异步的 你的handler new在主线程里,而主线程里面执行的东西很多所以导致很卡 如果你的handler new在新的线程里就不会出现这种问题。
public class RunInOtherThread { private static final String LOG_TAG = "RunInOtherThread"; LooperThread localThread = new LooperThread(); public RunInOtherThread(){ localThread.start(); } public Handler getHandler(){ return localThread.getHandler(); } private class LooperThread extends Thread { private Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { onReceiveMessage(msg.what); } }; Looper.loop(); } Handler getHandler(){ return mHandler; } } public void sendMessage(int what){ getHandler().sendEmptyMessage(what); } public void onReceiveMessage(int what){}; } 思路不错 但是你写的这个有问题 start只是让线程进入就绪状态 并不一定立马执行 所以你 public Handler getHandler(){ return localThread.getHandler(); }这一句有可能会返回null
|
|
返回顶楼 | |
发表时间:2012-05-04
http://stackoverflow.com/questions/4838207/how-to-create-a-looper-thread-then-send-it-a-message-immediately
这里有类似的问题 也给出解决方案 |
|
返回顶楼 | |
浏览 4796 次