手机移动程序开发Android开发Android知识

Android子线程使用Handler情况分析

2017-01-02  本文已影响0人  and2long

如果在子线程中直接创建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();
上一篇 下一篇

猜你喜欢

热点阅读