Toast工具类

解决Android 7.1系统报错

通过反射注入在发生异常的地方进行try catch

package com.ding.basic.util;

import android.content.Context;

import android.os.Build;

import android.os.Handler;

import android.os.Message;

import android.support.annotation.LayoutRes;

import android.view.LayoutInflater;

import android.widget.TextView;

import android.widget.Toast;

import com.ding.basic.Config;

import com.ding.basic.constants.C;

import java.lang.reflect.Field;

/**

* 解决Android 7.1系统报错

* 通过反射注入在发生异常的地方进行try catch

*/

public class ToastUtils {

private static ToastmToast;

    private static FieldsField_TN;

    private static FieldsField_TN_Handler;

    static {

try {

sField_TN = Toast.class.getDeclaredField("mTN");

            sField_TN.setAccessible(true);

            sField_TN_Handler =sField_TN.getType().getDeclaredField("mHandler");

            sField_TN_Handler.setAccessible(true);

        }catch (Exception e) {

}

}

private static void hook(Toast toast) {

try {

Object tn =sField_TN.get(toast);

            Handler preHandler = (Handler)sField_TN_Handler.get(tn);

            sField_TN_Handler.set(tn, new SafelyHandlerWarpper(preHandler));

        }catch (Exception e) {

}

}

public static void showToastNoRepeat(String text) {

try {

if (mToast ==null) {

mToast = Toast.makeText(Config.getContext(), text, Toast.LENGTH_SHORT);

            }else {

mToast.setText(text);

                mToast.setDuration(Toast.LENGTH_SHORT);

            }

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {

hook(mToast);

            }

mToast.show();

        }catch (Exception e) {

e.printStackTrace();

        }

}

public static void showDebugToastNoRepeat(String text) {

if (C.DEVELOP) {

if (mToast ==null) {

mToast = Toast.makeText(Config.getContext(), text, Toast.LENGTH_SHORT);

            }else {

mToast.setText(text);

                mToast.setDuration(Toast.LENGTH_SHORT);

            }

mToast.show();

        }

}

/**

* 显示自定义布局Toast

*/

    public static void showCustomToast(Context context, @LayoutRes int layoutResId, int gravity, String message, int duration) {

Toast toast =new Toast(context);

        TextView view = (TextView) LayoutInflater.from(context).inflate(layoutResId, null, false);

        toast.setView(view);

        view.setText(message);

        toast.setGravity(gravity, 0, 0);

        toast.setDuration(duration);

        toast.show();

    }

public static class SafelyHandlerWarpperextends Handler {

private Handlerimpl;

        public SafelyHandlerWarpper(Handler impl) {

this.impl = impl;

        }

@Override

        public void dispatchMessage(Message msg) {

try {

super.dispatchMessage(msg);

            }catch (Exception e) {

}

}

@Override

        public void handleMessage(Message msg) {

impl.handleMessage(msg);//需要委托给原Handler执行

        }

}

}

你可能感兴趣的:(Toast工具类)