Отвечая на исходный вопрос: +1 к @PeterKnego ответу.
Отвечая на ваш последний комментарий «Что мне делать, сделать localArrayPeople = null, когда я закончил?»: Нет, ваш AsyncTask содержит ссылку на Activity, поскольку каждый внутренний класс содержит ссылку на свой внешний класс (черезскрытое поле this$0
).
Как указано в статье, на которую я ссылался в своем комментарии (« Предотвращение утечек памяти »):
Избегайтестатические внутренние классы в деятельности, если вы не управляете их жизненным циклом, используйте статический внутренний класс и даете слабую ссылку на деятельность внутри.
Таким образом, сделайте свой класс AsyncTaskDoStuff статическим inner one:
private static class AsyncTaskDoStuff extends AsyncTask<Long, Integer, Integer>
Если вам нужно использовать объект Context в AsyncTask, передайте контекст приложения в конструктор AsyncTaskDoStuff:
private static class AsyncTaskDoStuff extends AsyncTask<Long, Integer, Integer> {
private final Context context;
AsyncTaskDoStuff(Context context) {
this.context = context;
}
}
// in the activity:
AsyncTaskDoStuff async = new AsyncTaskDoStuff(getApplicationContext());
То же самое применимо, если вам нужночтобы прочитать некоторые поля Activity, передайте их через конструктор AsyncTaskDoStuff (или через его метод execute
).
Если вам нужно изменить поля Activity в AsyncTask.doInBaМетод ckground делает следующее:
private static class AsyncTaskDoStuff extends AsyncTask<Long, Integer, Integer> {
private final WeakReference<MyActivity> ref;
AsyncTaskDoStuff(MyActivity activity) {
this.ref = new WeakReference<MyActivity>(activity);
}
@Override
protected Integer doInBackground(Long... params) {
MyActivity activity = ref.get();
if (activity != null) {
// access activity fields here
activity.someField = ...
...
} else {
// activity object was already destroyed
}
}
}
// make sure accessed field is declared as volatile in the Activity
private volatile int someField;