片段更改后,在OnPostExecute()中敬酒

时间:2019-05-30 08:39:44

标签: android

我的活动中有两个片段:Fragment_A和Fragment_B。

在片段A中,我创建了一个AsyncTask(当用户“ swipeRefreshes”屏幕时)。在此任务的onPostExecute()中,我想显示一个Toast:

private class MakeRequestTask extends AsyncTask<Void, Void, List<String>> {
    private Exception mLastError = null;

    MakeRequestTask() {
        //Some stuff
    }

    @Override
    protected List<String> doInBackground(Void... params) {
        //Some stuff
    }

    @Override
    protected void onPreExecute() {
        //Some stuff
    }

    @Override
    protected void onPostExecute(List<String> output) {
        swipeRefreshLayout.setRefreshing(false);
        Toast.makeText(getActivity(), "TO_DISPLAY", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onCancelled() {
        swipeRefreshLayout.setRefreshing(false);
        //Some stuff
    }
}


如果用户在AsyncTask完成之前从Fragment_A更改为Fragment_B,则会崩溃:

  

java.lang.IllegalStateException:片段Fragment_A未附加到上下文。

我知道如何避免崩溃(通过添加条件isAdded()),但我希望无论我的Activity顶部显示/显示哪个片段,都显示我的Toast。

3 个答案:

答案 0 :(得分:0)

尝试这种方式 在Fragment_A中声明布尔值

private boolean isFragmentVisible=false;

Fragment_A类中

在此onCreateView()的{​​{1}}中将此布尔值设为true

Fragment_A

然后将此片段A的 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment view = inflater.inflate(R.layout.lyourlayout, container, false); isFragmentVisible = true; return view; } 中的布尔值设为false

onDestroyView()
  

最终在@Override public void onDestroyView() { super.onDestroyView(); isFragmentVisible = false; } 的Asyntask中使用它

Fragment_A

答案 1 :(得分:0)

首先,我想建议您,请使您的MakeRequestTask内部类为静态类,因为这可能会导致内存泄漏。 对于您的问题,您需要将上下文传递给此类,如下所示:

    private static class MakeRequestTask extends AsyncTask<Void, Void, List<String>> {
        private Exception mLastError = null;
        private WeakReference<Context> weakReference;

        MakeRequestTask(Context context) {
            //Some stuff
            weakReference = new WeakReference<>(context);
        }

        @Override
        protected List<String> doInBackground(Void... params) {
            //Some stuff
        }

        @Override
        protected void onPreExecute() {
            //Some stuff
        }

        @Override
        protected void onPostExecute(List<String> output) {
// swipe layout will not be shown if fragment is not visible or destroyed
            if (isFragmentVisible) {
                swipeRefreshLayout.setRefreshing(false);
            }
// toast will be shown no matter what fragment is visible
            if (weakReference != null) {
                Context context = weakReference.get();
                if (context != null) {
                    Toast.makeText(context, "TO_DISPLAY", Toast.LENGTH_SHORT).show();
                }
            }
        }

        @Override
        protected void onCancelled() {
            if (isFragmentVisible) {
                swipeRefreshLayout.setRefreshing(false);
            }
            //Some stuff
        }
    }

答案 2 :(得分:0)

或者您也可以在interface方法中使用和EventBusonPostExecute,并在活动中显示Toast

@Override
    protected void onPostExecute(List<String> output) {
        swipeRefreshLayout.setRefreshing(false);
        activityContractInterface.showToast()
        }
    }

在您的活动中:

@Override
public void showToast(){
     Toast.makeText(getActivity(), "TO_DISPLAY", Toast.LENGTH_SHORT).show();
}

或者使用EventBus方法:

@Override
        protected void onPostExecute(List<String> output) {
            swipeRefreshLayout.setRefreshing(false);
            EventBus.getDefault().post(new ShowToastEvent()) 
//just create an empty class, hope you know what EventBus is
            }

在您的活动中:

@Subscribe(threadMode = ThreadMode.Main){
 Toast.makeText(getActivity(), "TO_DISPLAY", Toast.LENGTH_SHORT).show();
}

EventBusLibrary