У меня есть ListFragment
, который я хочу обновить регулярно. Сам процесс обновления довольно сложный и может занять некоторое время. Вот почему я создал поток, который выполняет новое обновление через 5 секунд после того, как было выполнено предыдущее обновление. Затем я создаю обработчик для обновления списка, сохраняя при этом отслеживание позиции в списке.ListFragment: предотвратить состояние гонки между getListView() и onDestroyView()
Проблема заключается в том, что путем быстрого скольжения между фрагментами в моей ViewPager
я могу заставить состояние гонки: onDestroyView()
может быть вызван до обработчика вызовов getListView()
, что приводит к следующей ошибке:
java.lang.IllegalStateException: Content view not yet created
Мой вопрос: как я могу предотвратить это состояние гонки? Есть ли способ проверить, все еще существует? К сожалению, недостаточно проверить код updateThread
в коде ниже.
public class MyFragment extends ListFragment {
private Thread updateThread = null;
public void startUpdate() {
/* Kill old thread */
if (updateThread != null) {
updateThread.interrupt();
}
final Handler handler = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
while (true) {
// ... collect data in `adapter`
final ArrayAdapter<String[]> ada = adapter;
handler.post(new Runnable() {
@Override
public void run() {
if (ada != null) {
// restore view position
int index = getListView().getFirstVisiblePosition(); // CRASH here
View v = getListView().getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
setListAdapter(ada);
ada.notifyDataSetChanged();
getListView().setSelectionFromTop(index, top);
}
}
});
//... sleep for some second
}
}
};
updateThread = new Thread(r);
updateThread.start(); // start updating
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
startUpdate();
} else {
if (updateThread != null) {
updateThread.interrupt();
}
}
}
}