Android子线程使用Handler情况分析

如果在子线程中直接创建Handler并使用,如下代码所示:

new Thread(){   
     @Override    
     public void run() {        
          Handler handler = new Handler() {           
              @Override          
              public void handleMessage(Message msg) {                
              Toast.makeText(MainActivity.this, "handler msg", Toast.LENGTH_SHORT).show();            
              }        
          };        
          handler.sendEmptyMessage(0);   
     }
}.start();

此时运行会报异常:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

原因分析:
非主线程默认没有创建Looper对象,也没有没有开启消息循环。

解决方法:

  1. 直接获取当前子线程的looper
new Thread(){   
       @Override    
       public void run() {        
           Looper.prepare();  //获取当前线程的Looper,并prepare();
           Handler handler = new Handler() {           
               @Override          
               public void handleMessage(Message msg) {                
                   Toast.makeText(MainActivity.this, "handler msg", Toast.LENGTH_SHORT).show();            
               }        
           };        
           handler.sendEmptyMessage(0);   
           Looper.loop();  //looper开始处理消息。
       }
}.start();
  1. 获取主线程的lopper
new Thread(){   
       @Override    
       public void run() {        
           Handler handler = new Handler(getMainLooper()) {           //直接使用主线程的Looper
               @Override          
               public void handleMessage(Message msg) {                
                   Toast.makeText(MainActivity.this, "handler msg", Toast.LENGTH_SHORT).show();            
               }        
           };        
           handler.sendEmptyMessage(0);   
      }
}.start();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容