2

我正在修改我的活动中的以下代码:

new Handler().postDelayed(new Runnable() {
 public void run() {
    txtStatus.setText("hello");
  }
}, 1000);

到:

static Runnable myRunnable = new Runnable() {
public void run() {
   txtStatus.setText("hello");
};

new Handler().postDelayed(myRunnable, 1000);

这显然是行不通的,因为我们引用了一个非静态变量。

这也不起作用:

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);

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

4

2 回答 2

5

您可以使用 Wea​​kReference 来避免内存泄漏问题。这是一些代码,说明了这个想法

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);
于 2013-07-22T00:58:40.570 回答
4

尝试这样的事情:

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将永远不会被调用onDestroyremoveCallbacks
  • 我替换new Handler()txtStatus,因为每个View都有自己的实例,Handler无需创建额外的实例
于 2013-07-22T01:36:56.247 回答