【问题标题】:static runnable in ActivityActivity中的静态可运行
【发布时间】:2013-07-20 15:35:33
【问题描述】:

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

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

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

【问题讨论】:

  • 在之前的问题中标记正确答案可能是个好主意。

标签: java android memory-leaks android-handler android-memory


【解决方案1】:

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

【讨论】:

  • 使用WeakReference 并没有太大帮助。
  • 它不会阻止内存泄漏。 Activity 被销毁后,WeakReference 仍然可以返回给你一个强引用。
  • 好吧,我不同意你的观点,如果没有其他对活动的强引用,它不会返回给你一个强引用。您应该检查文档。
  • 弱可达对象最终将被收集,但没有指定何时并且肯定不会在它们变得弱可达时发生。
  • 是的,但这确实没有问题。如果您担心在 onDestroy 之后调用活动,您可以在 onDestroy 方法中提出一个标志,并在获得引用时检查它。否则存在 WeakReference 无关紧要,Activity 会在应该被正常回收的时候被垃圾回收。
【解决方案2】:

试试这样的:

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

注意事项:

  • 这样可以避免内存泄漏,因为如果你调用removeCallbacks,你的run 将永远不会在onDestroy 之后被调用
  • 我将new Handler() 替换为txtStatus,因为每个View 都有自己的Handler 实例,无需创建额外的实例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2019-02-17
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多