2013-07-22 3 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

Он не останавливает утечку памяти. После того, как 'Активность' будет уничтожена,' WeakReference' еще может вернуть вам сильную ссылку на нее. –