2013-07-22 65 views
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); 

因此,如何將我的最初的例子改寫爲使用靜態類,而不是一個匿名內部類的(以避免內存泄漏的可能)?

+1

在您以前的問題中標記正確的答案可能是一個好主意。 –

回答

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將永遠不會被onDestroy之後調用如果您致電removeCallbacks
  • 我將new Handler()替換爲txtStatus,因爲每個View都有其自己的實例Handler並且不需要創建額外的一個
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); 
+0

使用'WeakReference'並沒有太大的幫助。 –

+0

什麼不行? – Desert

+2

它不會停止內存泄漏。 'Activity'被銷燬後,'WeakReference'仍然可以返回給你一個強烈的引用。 –