解决Handler与Activity同步冲突

这个问题可以由Handler的一个子类HandlerThread来解决。

程序参考自Mars老师的Android课程第一季第十五集。

代码以及注释有所改动,如下:

 
  1. package com.handler.androidhandler02;   
  2.   
  3. import android.app.Activity;   
  4. import android.os.Bundle;   
  5. import android.os.Handler;   
  6. import android.os.HandlerThread;   
  7. import android.os.Looper;   
  8. import android.os.Message;   
  9.   
  10. public class FirstActivity extends Activity    
  11. {   
  12.   
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState)    
  15.     {   
  16.         super.onCreate(savedInstanceState);   
  17.         setContentView(R.layout.activity_first);   
  18.         //取得HandlerThread对象   
  19.         HandlerThread handlerThread = new HandlerThread("handlerThead");   
  20.         handlerThread.start();   
  21.         //通过HandlerThread对象的getLooper方法取得异步线程(这里自定义为SonHandler)类的对象   
  22.         SonHandler sonHandler= new SonHandler(handlerThread.getLooper());   
  23.         //通过已经取得的异步线程类来取得Message对象   
  24.         Message notice=sonHandler.obtainMessage();   
  25.         //设置要传递的消息,通过Bundle对象来实现   
  26.         Bundle b = new Bundle();   
  27.         b.putString("name","Tom");   
  28.         notice.setData(b);   
  29.     }   
  30. //  自定义SonHandler需要继承Handler,并且需要重新书写构造方法,第二个构造方法的参数Looper是必须的,这个Looper与上面创建这个类的getLooper()相关   
  31.     class SonHandler extends Handler   
  32.     {   
  33.         public SonHandler(){}   
  34.         public SonHandler(Looper looper)    
  35.         {   
  36.             super(looper);   
  37.         }   
  38.            
  39. //      下面是错误的写法……   
  40. //      public void SonHandler(Looper looper)   
  41. //      {   
  42. //          super(looper);   
  43. //      }   
  44.            
  45.         //覆写方法对要处理的Message信息进行处理   
  46.         @Override  
  47.         public void handleMessage(Message notice)   
  48.         {   
  49.             Bundle  b= notice.getData();   
  50.             //得到字符串的键值   
  51.             String name = b.getString("name");   
  52.             System.out.println(name);   
  53.         }   
  54.     }   
  55. }  

你可能感兴趣的:(Activity)