gpt4 book ai didi

java - fragment 、AsyncTask 和监听器

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:59 24 4
gpt4 key购买 nike

这是我最近遇到的问题。有时,在我使用主页按钮退出应用程序并让它在后台闲置一段时间后,我得到 getActivity() 的空指针。所以我只是想知道我是否设置了错误的异步任务和监听器,或者问题出在其他地方。我的一般流程如下:

public class MyAsyncTask extends AsyncTask<Void, Void, List<SomeObject>>{

private Context ctx;
private AsyncListener listener;

public MyAsyncTask(Context ctx){
//set Context, etc
}

...
onPostExecute(List<SomeObject> result){
super.onPostExecute(result);
if(result!=null){
listener.onAvailable(result);
} else {
listener.onUnavailable();
}
}

public interface AsyncListener{
void onAvailable(List<SomeObject> result);
void onUnavailable();
}

public void setAsyncListener(AsyncListener listener){
this.listener = listener;
}
}

fragment :

public class MyFragment extends Fragment implements AsyncListener {

private AsyncTask task;
private List<SomeObject> data;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment_messages, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);

setViews();
if(data == null) {
task = new AsyncTask(getActivity());
task.setAsyncListener(this);
task.execute();
} else {
setData();
}
}

private void setData(){
someListView.setAdapter(new SomeAdapter(getActivity(), data));
}

@Override
public void onAvailable(List<SomeObject> result){
this.data = result;
setData();
}

@Override
public void onUnavailable(List<SomeObject> result){
//Create toast or alert dialog, etc
}

}

如您所见,我使用监听器将 asynctask 的结果发布到我的 fragment 中。问题是,我有时在设置适配器时在 getActivity() 上收到空指针。只有当我退出应用程序,让它在后台停留较长时间然后打开它时才会发生这种情况。也许在附加 Fragment 之前会触发监听器?也许我需要以不同的方式设置我的逻辑?

最佳答案

问题出在这段代码

private void setData(){
someListView.setAdapter(new SomeAdapter(getActivity(), data));
}

当您关闭 Activity 时,它可能会在后台消失。当 Asynctask 完成并且从监听器调用 SetData 函数时,它为 getActivity() 获取 null,因为它已被操作系统销毁。在设置适配器之前检查 getActivity() 是否为 null。

关于java - fragment 、AsyncTask 和监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24259218/

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