我的活动中有两个片段: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。
答案 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
方法中使用和EventBus
或onPostExecute
,并在活动中显示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();
}