Android 解决Handler内存泄漏问题
前言
最近在维护老项目的时候发现,使用handler延时处理的事件再activity结束后仍旧再执行,导致activity再次被创建,或activity迟迟无法正常结束,或者直接崩溃。好吧,说了这么久的内存泄漏终于要和它面对面刚了
更多描述
解决方法
自定义弱引用Handler
我这边使用了 AppCompatActivity ,你可以根据自己所使用的进行修改调整
/**
* 封装Handler子类
* $ 解决handler内存泄漏问题
*
* @author D10NG
* @date on 2019-09-28 11:11
*/
public class BaseHandler extends Handler {
final WeakReference<AppCompatActivity> act;
final WeakReference<BaseHandlerCallBack> callBack;
public BaseHandler(AppCompatActivity c, BaseHandlerCallBack b) {
act = new WeakReference<>(c);
callBack = new WeakReference<>(b);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
AppCompatActivity c = act.get();
BaseHandlerCallBack b = callBack.get();
if (c != null && b != null) {
b.callBack(msg);
}
}
public interface BaseHandlerCallBack {
void callBack(Message msg);
}
}
----------------- 2019 - 10 - 24 更新 -----------------
Kotlin版
class BaseHandler(c: AppCompatActivity, b: BaseHandlerCallBack) : Handler() {
private val act: WeakReference<AppCompatActivity> = WeakReference(c)
private val callBack: WeakReference<BaseHandlerCallBack> = WeakReference(b)
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
val c = act.get()
if (c != null) {
callBack.get()?.callBack(msg)
}
}
interface BaseHandlerCallBack {
fun callBack(msg: Message)
}
}
----------------- 2019 - 10 - 24 更新 -----------------
创建BaseActivity
public abstract class BaseActivity extends AppCompatActivity implements BaseHandler.BaseHandlerCallBack {
/** handler */
protected BaseHandler mHandler;
@Override
public void callBack(Message msg) {
// handler消息回调
}
}
继承使用
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_main);
// 发送
mHandler.sendEmptyMessage(0);
}
@Override
public void callBack(Message msg) {
super.callBack(msg);
switch (msg.what) {
case 0:
// do
break;
case 1:
// do
break;
case 2:
// do
break;
}
}
}