如何阻止返回Activity A时仍显示网络检测Toast消息?
这个问题的核心原因很简单:Toast是系统级的弹窗,它的生命周期完全独立于你的Activity。所以当你从Activity B返回Activity A时,如果之前触发的"Check Internet" Toast还没走完它的显示时长,就会继续在A的界面上弹着,挺烦人的对吧?
下面给你几个实用的解决办法,你可以根据自己的代码结构选合适的:
方法1:在Activity B销毁时取消Toast
这个是最直接的思路,既然Toast是在Activity B里触发的,那就在B销毁的时候把它关掉。
首先,在Activity B里保留Toast的引用,然后在onDestroy()方法中取消它:
// 在Activity B的类中定义成员变量 private Toast mNetworkToast; // 你原本显示Toast的代码改成这样 if (!isNetworkAvailable()) { // 假设这是你的网络判断方法 // 先取消之前可能存在的Toast,避免重复显示 if (mNetworkToast != null) { mNetworkToast.cancel(); } mNetworkToast = Toast.makeText(this, "Check Internet", Toast.LENGTH_SHORT); mNetworkToast.show(); } // 重写Activity的onDestroy方法 @Override protected void onDestroy() { super.onDestroy(); // 销毁时取消Toast if (mNetworkToast != null) { mNetworkToast.cancel(); } }
如果Toast是在Activity B内部的Fragment里触发的,那就在Fragment的onDestroyView()或者onDestroy()方法里做同样的取消操作就行,记得Fragment里要用getActivity()来获取上下文创建Toast,同时要判断Activity是否还存活。
方法2:在适配器中管理Toast(适配你的BlogRecyclerAdapter场景)
如果Toast是在BlogRecyclerAdapter里触发的,那得注意两点:一是避免内存泄漏,二是能在Activity销毁时取消Toast。
可以给适配器加上Activity的弱引用,同时提供一个取消Toast的方法:
public class BlogRecyclerAdapter extends RecyclerView.Adapter<BlogRecyclerAdapter.ViewHolder> { // 用WeakReference持有Activity,防止内存泄漏 private WeakReference<Activity> mActivityWeakRef; private Toast mNetworkToast; // 构造方法传入Activity public BlogRecyclerAdapter(Activity activity) { mActivityWeakRef = new WeakReference<>(activity); } // 你原本触发Toast的地方改成这样 private void showNetworkErrorToast() { Activity activity = mActivityWeakRef.get(); // 先判断Activity是否还存活,避免空指针 if (activity != null && !activity.isFinishing()) { if (mNetworkToast != null) { mNetworkToast.cancel(); } mNetworkToast = Toast.makeText(activity, "Check Internet", Toast.LENGTH_SHORT); mNetworkToast.show(); } } // 对外提供取消Toast的方法 public void cancelNetworkToast() { if (mNetworkToast != null) { mNetworkToast.cancel(); } } }
然后在Activity B的onDestroy()里调用适配器的取消方法:
@Override protected void onDestroy() { super.onDestroy(); if (mBlogRecyclerAdapter != null) { mBlogRecyclerAdapter.cancelNetworkToast(); } }
额外小建议:用Snackbar代替Toast(可选)
如果你能接受替换成Snackbar的话,这个问题根本不用手动处理——Snackbar是和当前界面的View绑定的,当Activity销毁时,Snackbar会自动消失,而且交互性也更强。比如在Fragment里可以这样用:
Snackbar.make(getView(), "Check Internet", Snackbar.LENGTH_SHORT).show();
内容的提问来源于stack exchange,提问作者Rishiram Ranabhat

