【问题标题】:Fragments, AsyncTask and Listeners片段、AsyncTask 和监听器
【发布时间】:2014-08-07 04:40:20
【问题描述】:

这是我最近遇到的问题。有时在我使用主页按钮退出应用程序并让它在后台闲置一段时间后,我得到 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;
    }
}

片段:

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 发布到我的片段。问题是,在设置适配器时,我有时会在 getActivity() 上收到空指针。这只发生在我退出应用程序时,让它在后台停留很长一段时间,然后打开它。也许侦听器在附加片段之前被触发?也许我需要以不同的方式设置我的逻辑?

【问题讨论】:

    标签: java android android-fragments android-asynctask


    【解决方案1】:

    问题出在这段代码

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

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

    【讨论】:

    • 我可以尝试一下,它可能会阻止应用程序崩溃,但我想也许我应该将我的听众设置在片段的不同生命周期中,而不是在 onActivityCreated() 中?
    • 很可能监听器已正确注册,因为它在您创建它时找到了活动。仅当异步任务在未来的不确定时间完成并且它没有找到它期望发现此错误发生的活动时。所以我认为这与异步操作风格的本质有关,而不是其他任何东西。
    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多