在Activity中静态runnable

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)

那么我的初始示例如何被重写为使用静态类而不是匿名内部类(以避免内存泄漏的可能性)?

Des*_*ert 5

您可以使用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)

  • 它不会阻止内存泄漏.在`Activity`被销毁之后,`WeakReference`仍然可以为你提供一个强引用. (2认同)

Mac*_*ski 5

尝试这样的事情:

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将永远不会被调用onDestroyremoveCallbacks
  • 我替换new Handler()为txtStatus,因为每个View都有自己的实例Handler,不需要创建额外的实例