1

我正在尝试显示来自 customExceptionHandler 类的 Toast 消息。但我无法做到这一点。

我已经看到了类似的问题,例如从 Application 类中显示 Toast 消息但是,它仍然没有解决我的问题。有什么我在这里想念的吗。

我可以在 Logcat 中看到 Log 语句,但是 toast 没有出现

public class MyApplication extends Application {

    private Thread.UncaughtExceptionHandler defaultUEH;

    private Thread.UncaughtExceptionHandler unCaughtExceptionHandler =
            new Thread.UncaughtExceptionHandler() {
                @Override
                public void uncaughtException(Thread thread, final Throwable ex) {
                    Log.e("Inside Run", "******************** Inside uncaughtException ***************" + ex.getMessage());
                    Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_SHORT).show();
                }
            };

    public MyApplication() {
        defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(unCaughtExceptionHandler);
    }

}

我又尝试了一件事情,我知道静态方法和变量不是最佳解决方案,但是我在一个 util 类中创建了一个静态方法,在静态变量中维护了 activitiy 上下文,并用它来显示一个也没有的祝酒词不工作

喜欢

Util.showToast(ex.getMessage()); 

在 uncaughtException() 方法中

4

3 回答 3

0

Android Manifest 文件,声明如下。

 <application android:name="com.example.MyApplication">

    </application>

然后编写类:

public class MyApplication extends Application {

    private static Context context;

    public void onCreate() {
        super.onCreate();
        MyApplication.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return MyApplication.context;
    }
}

现在到处调用MyApplication.getAppContext()以静态获取您的应用程序上下文。

于 2017-09-05T10:39:34.883 回答
0

这对我有用

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread paramThread, Throwable paramThrowable) {

            new Thread() {
                @Override
                public void run() {
                    Looper.prepare();
                    Toast.makeText(getActivity(),"Your message", Toast.LENGTH_LONG).show();
                    Looper.loop();
                }
            }.start();
            try
            {
                Thread.sleep(3000); // Let the Toast display before app will get shutdown
            }
            catch (InterruptedException e) {    }
            System.exit(2);
        }
    });
于 2019-01-27T12:59:00.170 回答
-1

如果你想在你的应用程序类中显示 Toast,那么它必须有一个显示 Toast 的上下文,这样你就可以在你的构造函数中传递 Context 或获取活动实例

我没有尝试过这段代码,但你应该试试这个:

private static ApplicationContext instance;
/**
 * Your Constructor
 */
public MyApplication() {
    instance = this;
}

/**
 * Gets the application context.
 * @return the application context
 */
public static Context getContext() {
    if (instance == null) {
        instance = new ApplicationContext();
    }
    return instance;
}

       public static void showToast(String data) {
        Toast.makeText(getContext(), data,
                Toast.LENGTH_SHORT).show();
    }
于 2017-09-05T10:22:41.827 回答