我已经通过提出这个问题来解决我的内存泄漏了:
MemoryLeak trough onConfigurationChanged()
现在我知道我的泄漏是由于设备旋转而重新创建活动造成的。
我在我的活动中创建了对searchbar
的引用:
searchbar = (EditText) findViewById(R.id.my_searchbar);
并将此引用传递给我的AsyncTask
,而Activity
不是我myWorkerClass.clearMemory();
myWorkerClass = new WorkerClass(getApplicationContext(), gv, searchbar, width, scaleButtonText);
myWorkerClass.execute();
的内部类:
AsyncTask
在我的onTextChangedListener
我添加searchbar
到我的searchbar.addTextChangedListener(myTextWatcher);
:
AsyncTask
当定向更改发生时,我需要再次调用clearMemory
。为了防止MemoryLeaks,我调用AsyncTask
之前是我的public void clearMemory() {
searchbar.removeTextChangedListener(myTextWatcher);
}
:
onConfigurationChange()
问题
调用Activity
时我已经有了一个由操作系统创建的新clearMemory
。
这意味着我对搜索栏的原始引用不再适用于我。
因此,我的textChangedListener
不会从我的搜索栏中移除AsyncTask
...
然后我再次启动onTextChangedListener
,这会在我的搜索栏中添加另一个clearMemory()
,从而创建内存泄漏。
我的问题
我该如何防止这种情况发生。 (我真的很感谢代码片段有一个简短的解释)。
如何在创建新活动后获取旧引用。或者,由于设备的旋转,如何在操作系统创建新活动之前短时间调用WeakReference
。
我赞赏任何帮助。
更新
抱歉,我忘了添加解决此问题的方法:
我还尝试创建WeakReference<EditText> myWeakReference = new WeakReference<EditText>(searchbar)
:
AsyncTask
并将myWorkerClass = new WorkerClass(getApplicationContext(), gv, myWeakReference.get(), width, scaleButtonText);
myWorkerClass.execute();
的引用添加为:
{{1}}
答案 0 :(得分:0)
在UI线程上创建SearchBar和TextWatcher,并且只在需要获取某些内容时调用TextWatcher中的AsyncTasks(最好通过某种类型的侦听器)。像这样:
SearchBar searchBar = (EditText) findViewById(R.id.my_searchbar);
searchBar.addTextChangedListener(myTextWatcher);
public class myTextWatcher implements TextWatcher {
afterTextChanged(){
/* Invoke the AsyncTask here so it can retrieve data and return it through some listener /*
}
}
请尝试将以下参数添加到Manifest中的标记:
android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize|navigation|uiMode"
它应该可以防止活动完全死亡。