防止我的记忆泄漏

时间:2014-12-12 13:10:22

标签: android memory-leaks android-asynctask

我已经通过提出这个问题来解决我的内存泄漏了:

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}}

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"

它应该可以防止活动完全死亡。