Kotlin 实现
kotlin 中处在其他类中,没有标记
inner
的类为嵌套类,标记了inner
的类为内部类。只有内部类才会带有一个对外部类的对象的引用。因此, WeakHandler 无需声明为静态
class MyActivity : AppCompatActivity() {
val handler = WeakHandler(this)
class WeakHandler(activity: Activity) : Handler() {
private val weakReference = WeakReference(activity)
override fun dispatchMessage(msg: Message) {
weakReference.get()?.let {
//todo
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
//...
Thread(Runnable {
handler.sendMessageAtTime(...);
}).start()
}
}
Java 实现
首先, handler 必须是静态内部类实现,其次要弱引用外部对象
public class MyActivity extends Activity {
private WeakHandler handler;
static class WeakHandler extends Handler {
private Activity activity;
WeakHandler(WeakReference<Activity> weakReference){
activity = weakReference.get();
}
@Override
public void handleMessage(@NonNull Message msg) {
//todo
}
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new Thread(new Runnable() {
@Override
public void run() {
handler.sendMessage();
}
}).start();
}
}
内存泄漏的原因
生命周期长的持有了生命周期短的引用
常见的内存泄漏
- 资源对象没关闭造成的内存泄漏(如: Cursor、File等)
- 接收器、监听器注册没取消造成的内存泄漏,如广播,eventsbus
- Activity 的 Context 造成的泄漏,可以使用 ApplicationContext
- 单例中的static成员间接或直接持有了activity的引用
- 全局集合类强引用没清理造成的内存泄漏(特别是 static 修饰的集合)
参考
[1]risechen.一般什么情况下会导致内存泄漏问题[EB/OL].https://github.com/Moosphan/Android-Daily-Interview/issues/3
[2]Moosphan,Shanlovana,zhaoyujie.自定义 Handler 时如何有效地避免内存泄漏问题[EB/OL].https://github.com/Moosphan/Android-Daily-Interview/issues/1