gpt4 book ai didi

android - 列表 fragment : prevent race condition between getListView() and onDestroyView()

转载 作者:行者123 更新时间:2023-11-29 01:50:48 26 4
gpt4 key购买 nike

我有一个 ListFragment,我想定期更新它。更新过程本身非常复杂,可能需要一些时间。这就是为什么我创建了一个线程,在上一次更新完成后 5 秒执行新的更新。然后我创建一个处理程序来更新列表,同时跟踪列表中的位置。

问题是,通过在我的 ViewPager 中的 fragment 之间快速滑动,我可以强制出现竞争条件:可以在处理程序调用 getListView 之前调用 onDestroyView() (),导致如下错误:

java.lang.IllegalStateException: Content view not yet created

我的问题是:如何防止这种竞争情况?有什么方法可以检查 View 是否仍然存在?遗憾的是,在下面的代码中检查 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检查您的 fragment 是否附加到 Activity

关于android - 列表 fragment : prevent race condition between getListView() and onDestroyView(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18250416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com