wxr
2022-11-23 1e7b3abd15d37f6c6bc97ac14922457b9604c275
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.mm.android.deviceaddmodule.mobilecommon.common;
 
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
 
import com.mm.android.deviceaddmodule.mobilecommon.base.BaseHandler;
 
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
 
/**
 * Handler管理类,方便界面创建匿名Handler,防止内存泄露
 */
public class HandlerManager {
    public  static final  String TAG = "HandlerManager";
    private List<WrapHandler>  mHandlers;
 
    public HandlerManager(){
        mHandlers = new ArrayList<>();
    }
 
    public static class WrapHandler extends  Handler{
        //真正外部使用的Handler,强引用防止回收,等处理之后解除引用
        private Handler mTarget;
        private WeakReference<List<WrapHandler>>  mHandlers;
        public WrapHandler(Handler target,WeakReference<List<WrapHandler>> handlers){
            mTarget = target;
            mHandlers = handlers;
        }
 
        public  Handler getTartgetHandler(){
            return mTarget;
        }
 
        @Override
        public void handleMessage(Message msg) {
            if(mTarget != null){
                mTarget.handleMessage(msg);
            }
            List<WrapHandler> handlers = mHandlers.get();
            if(handlers != null){
                //执行结束删除对应Handler
                handlers.remove(this);
            }
        }
    }
 
    private WrapHandler wrapHandler(@NonNull Handler handler){
        return new WrapHandler(handler, new WeakReference<>(mHandlers));
    }
 
    public Handler addHandler(@NonNull final Handler handler){
        WrapHandler wrapHandler = wrapHandler(handler);
        mHandlers.add(wrapHandler);
        return wrapHandler;
    }
 
    public void clearHandlers(){
        //取消数据回调
        for(Handler h : mHandlers){
            if(h instanceof BaseHandler){
                ((BaseHandler) h).cancle();
            }
        }
        mHandlers.clear();
    }
}