Android中使用Handler的推荐方法

239 阅读1分钟

Handler的实现类采用静态内部类的方式,避免对外部类的强引用,在其内部声明一个WeakReference引用到外部类的实例

MyHandler mHandler;
mHandler = new MyHandler(this);

static class MyHandler extends Handler {   
     private WeakReference<BaseActivity> activityWeakReference;   

     public MyHandler(BaseActivity activity) {        
                super();        
                this.activityWeakReference = new WeakReference<BaseActivity>(activity);   
     }    

     @Override    
     public void handleMessage(Message msg) {        
         BaseActivity baseActivity = activityWeakReference.get();       
         if (baseActivity == null) {            
                           return;        
         }else{
                 // Do something with baseActivity as your wish
                 //baseActivity.handleMessage(msg);   
         }
     }
 }

注:另外一种个人相对推荐的写法:直接继承Handler,实现原有的Callback接口

private Handler.Callback callback = new Handler.Callback() {
                @Override
                public boolean handleMessage(Message msg) {
                        switch (msg.what){
                                case :
                                        //Do something as your wish
                                        break;
                        }
                        return true;
                }
        };

private Handler handler = new WeakRefHandler(Looper.getMainLooper(), callback);

public final class WeakRefHandler extends Handler {
    private static class WeakRefCallback implements Callback{
        private WeakReference<Callback> callbackRef;
        private WeakRefCallback(Callback callback){
            callbackRef = new WeakReference<Callback>(callback);
        }
        @Override
        public boolean handleMessage(Message msg) {
            if(callbackRef != null){
                Callback cb = callbackRef.get();
                if(cb != null){
                    return cb.handleMessage(msg);
                }
            }
            return false;
        }
    }
    public WeakRefHandler(Looper looper, Callback callback) {
        super(looper, new WeakRefCallback(callback));
    }
    public WeakRefHandler(Callback callback){
        super(Looper.myLooper(), new WeakRefCallback(callback));
    }
}