電解金屬錳......你不應該這樣做。
因爲匿名類如何訪問父類方法或字段是通過存儲對父類的不可見引用。
比如你有一個Activity
:
public class MyActivity
extends Activity
{
public void someFunction() { /* do some work over here */ }
public void someOtherFunction() {
Runnable r = new Runnable() {
@Override
public void run() {
while (true)
someFunction();
}
};
new Thread(r).start(); // use it, for example here just make a thread to run it.
}
}
編譯器實際上會產生這樣的事情:
private static class AnonymousRunnable {
private MyActivity parent;
public AnonymousRunnable(MyActivity parent) {
this.parent = parent;
}
@Override
public void run() {
while (true)
parent.someFunction();
}
}
所以,當你的父母Activity
銷燬(由於配置改變,例如) ,而你的匿名課程仍然存在,整個活動無法進行。 (因爲有人仍然有一個參考。)
這會使內存泄漏並使您的應用程序進入LIMBO!
如果是我,我會實施 「onProgressUpdate()」 像這樣裝載機:
public class MyLoader extends AsyncTaskLoader<Something> {
private Observable mObservable = new Observable();
synchronized void addObserver(Observer observer) {
mObservable.addObserver(observer);
}
synchronized void deleteObserver(Observer observer) {
mObservable.deleteObserver(observer);
}
@Override
public void loadInBackground(CancellationSignal signal)
{
for (int i = 0;i < 100;++i)
mObservable.notifyObservers(new Integer(i));
}
}
而在你Activity
類
public class MyActivity extends Activity {
private Observer mObserver = new Observer() {
@Override
public void update(Observable observable, Object data) {
final Integer progress = (Integer) data;
mTextView.post(new Runnable() {
mTextView.setText(data.toString()); // update your progress....
});
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreated(savedInstanceState);
MyLoader loader = (MyLoader) getLoaderManager().initLoader(0, null, this);
loader.addObserver(mObserver);
}
@Override
public void onDestroy() {
MyLoader loader = (MyLoader) getLoaderManager().getLoader(0);
if (loader != null)
loader.deleteObserver(mObserver);
super.onDestroy();
}
}
期間onDestroy()
記得deleteObserver()
是非常重要的,這樣裝載者就永遠不會參考你的活動。 (在您的Application
生命週期中,裝載程序可能會保持活動狀態...)
我認爲這是一個非常聰明的黑客攻擊。我從來沒有想過。我正在尋找使用Loaders發送進度更新的方式。我會試一試,讓你知道。我認爲你的解決方案應該工作! – douggynix 2014-09-01 10:17:32
該鏈接似乎已經變質。 [這裏](https://yadi.sk/d/qovznXrpUbbum)是一個工作的(我認爲它是相同的)。 – EmmanuelMess 2017-07-25 15:07:15