Sta*_*wed 2 java android memory-leaks android-handler android-memory
我在我的活动中修改以下代码:
new Handler().postDelayed(new Runnable() {
public void run() {
txtStatus.setText("hello");
}
}, 1000);
Run Code Online (Sandbox Code Playgroud)
至:
static Runnable myRunnable = new Runnable() {
public void run() {
txtStatus.setText("hello");
};
new Handler().postDelayed(myRunnable, 1000);
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,因为我们引用了一个非静态变量.
这也不起作用:
public void setText() {
txtStatus.setText("hello");
}
static Runnable myRunnable = new Runnable() {
public void run() {
setText(); // doesn't work
MyActivity.this.setText(); // still doesn't work
};
new Handler().postDelayed(myRunnable, 1000);
Run Code Online (Sandbox Code Playgroud)
那么我的初始示例如何被重写为使用静态类而不是匿名内部类(以避免内存泄漏的可能性)?
您可以使用WeakReference来避免内存泄漏问题.这是一些代码,它说明了这个想法
public static class MyRunnable implements Runnable {
private WeakReference<Activity> activityRef;
public MyRunnable(Activity activity) {
activityRef = new WeakReference<Activity>(activity);
}
public void run() {
//some code
}
}
private MyRunnable runnable = new MyRunnable(this);
Run Code Online (Sandbox Code Playgroud)
尝试这样的事情:
private Runnable myRunnable = new Runnable() {
public void run() {
txtStatus.setText("hello");
}
};
// somewhere in code
txtStatus.postDelayed(myRunnable, 1000);
// in onPause or onDestroy
txtStatus.removeCallbacks(myRunnable);
Run Code Online (Sandbox Code Playgroud)
笔记:
run将永远不会被调用onDestroyremoveCallbacksnew Handler()为txtStatus,因为每个View都有自己的实例Handler,不需要创建额外的实例