我有一个ListFragment
我想定期更新的。更新过程本身非常复杂,可能需要一些时间。这就是为什么我创建了一个线程,在上一次更新完成 5 秒后执行新的更新。然后我创建一个处理程序来更新列表,同时跟踪列表中的位置。
问题是通过在我的片段之间快速滑动ViewPager
我可以强制一个竞争条件:onDestroyView()
可以在处理程序调用之前调用getListView()
,导致以下错误:
java.lang.IllegalStateException:尚未创建内容视图
我的问题是:我怎样才能防止这种竞争条件?有没有办法检查视图是否仍然存在?不幸的是,在下面的代码中检查是否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();
}
}
}
}