一般应用中会将Toast封装为一个工具类使用,但某些情况下调用Toast会出现 has already added to the window manager 导致程序崩溃问题

需要如下处理:

package com.example.toast.util;import android.os.Handler;import android.os.Message;import android.support.annotation.NonNull;import android.support.annotation.StringRes;import android.widget.Toast;import com.example.vlike.VLikeApplication;import java.lang.reflect.Field;public class ToastUtils {         private static Field sFieldTN;    private static Field sFieldTNHandler;    static {             try {                 sFieldTN = Toast.class.getDeclaredField("mTN");            sFieldTN.setAccessible(true);            sFieldTNHandler = sFieldTN.getType().getDeclaredField("mHandler");            sFieldTNHandler.setAccessible(true);        } catch (Exception e) {                 e.printStackTrace();        }    }    private static void hook(Toast toast) {             try {                 Object tn = sFieldTN.get(toast);            Handler preHandler = (Handler) sFieldTNHandler.get(tn);            sFieldTNHandler.set(tn, new SafelyHandlerWrapper(preHandler));        } catch (Exception e) {                 e.printStackTrace();        }    }    private static class SafelyHandlerWrapper extends Handler {             private Handler impl;        SafelyHandlerWrapper(Handler impl) {                 this.impl = impl;        }        @Override        public void dispatchMessage(Message msg) {                 try {                     super.dispatchMessage(msg);            } catch (Exception e) {                     e.printStackTrace();            }        }        @Override        public void handleMessage(Message msg) {                 impl.handleMessage(msg);        }    }    public static void showToast(@StringRes int id) {             showToast(VLikeApplication.getContext().getResources().getString(id), Toast.LENGTH_SHORT);    }    public static void showToast(@StringRes int id, int duration) {             showToast(VLikeApplication.getContext().getResources().getString(id), duration);    }    public static void showToast(@NonNull String msg) {             showToast(msg, Toast.LENGTH_SHORT);    }    public static void showToast(@NonNull String msg, int duration) {             Toast toast = Toast.makeText(VLikeApplication.getContext(), msg, duration);        // 在调用Toast.show()之前处理:        hook(toast);        toast.show();    }}

更多相关文章

  1. Python3原生编写月份计算工具
  2. 一款常用的 Squid 日志分析工具
  3. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android自动化工具Monkeyrunner使用(三)
  6. Android:AsyncTaskUtil 异步简化操作工具类
  7. Android之WebView简易应用
  8. android,JNI创建进程,使用fork()
  9. Android(安卓)wifi连接

随机推荐

  1. Android的多种数据存储方式
  2. android中sqlite数据库升级方案
  3. Android Theme使用总结
  4. android按行读取文件内容的几个方法
  5. Android之ScrollView滚动到指定位置
  6. android中的UriMatcher和ContentUris
  7. 用android完成第一个helloworld
  8. Android 开发入门-活动的最佳实践
  9. android 中 Canvas和Paint
  10. (两百八十七)Android 更新R aosp源码