我有一个要定期更新的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();
}
}
}
}
最佳答案
尝试使用isAdded检查片段是否已附加到活动
关于android - ListFragment:防止getListView()和onDestroyView()之间的竞争状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18250416/