论坛首页 移动开发技术论坛

弄错一个概念:Android的Thread与Handler是不同的!

浏览 4790 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-04-26  

弄错一个概念:Android的Thread与Handler是不同的!

 

一直以为Android中Handler的post方法会创建一个线程,一直都是这样编程过来,也没发现什么问题,

 

最近在编一个对线程要求很高的一个程序时,发现机器反应特别缓慢,一直找不到问题所在,

 

最后实在没办法用Thread代替Handler来创建线程,问题解决了...

 

原来一直是我的概念出现了问题,Handler并不是Android为新建线程而设立的方法,Handler其实是用来对控件进行异步刷新的方法。

 

 

对我的无知进行一个记录。

   发表时间:2012-04-27  

唉 又见小白了。。。。
Handler其实也是操作Thread的一种延伸和封装,你handler把程序搞慢了是因为你handler实例化的地方不对。

Handler的主要作用是能够让handler所在的线程以队列的形式去执行runnable,而且是异步的

你的handler new在主线程里,而主线程里面执行的东西很多所以导致很卡

如果你的handler new在新的线程里就不会出现这种问题。
说白了你还没搞清楚 Thread Looper Handler 的运行原理。看看下面的代码或许会有点感悟:

 

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){};
     
}
 

 

0 请登录后投票
   发表时间:2012-04-27  
受教了,还有很多需要学习的地方。

0 请登录后投票
   发表时间:2012-04-30  
那你以前做的程序打算怎办 ?
0 请登录后投票
   发表时间:2012-05-01  
endual 写道
那你以前做的程序打算怎办 ?


能重写就重写。
0 请登录后投票
   发表时间:2012-05-02  
不然怎么会有handler+thread异步这么一说呢?
0 请登录后投票
   发表时间:2012-05-04  
Cindy_Lee 写道

唉 又见小白了。。。。
Handler其实也是操作Thread的一种延伸和封装,你handler把程序搞慢了是因为你handler实例化的地方不对。

Handler的主要作用是能够让handler所在的线程以队列的形式去执行runnable,而且是异步的

你的handler new在主线程里,而主线程里面执行的东西很多所以导致很卡

如果你的handler new在新的线程里就不会出现这种问题。
说白了你还没搞清楚 Thread Looper Handler 的运行原理。看看下面的代码或许会有点感悟:

 

 

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 

 

0 请登录后投票
   发表时间:2012-05-04  
http://stackoverflow.com/questions/4838207/how-to-create-a-looper-thread-then-send-it-a-message-immediately

这里有类似的问题 也给出解决方案
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics