下面的异常是什么意思;我该怎么解决呢?

这是代码:

Toast toast = Toast.makeText(mContext, "Something", Toast.LENGTH_SHORT);

这是例外:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
     at android.os.Handler.<init>(Handler.java:121)
     at android.widget.Toast.<init>(Toast.java:68)
     at android.widget.Toast.makeText(Toast.java:231)

当前回答

Java 8

new Handler(Looper.getMainLooper()).post(() -> {
    // Work in the UI thread

}); 

科特林

Handler(Looper.getMainLooper()).post{
    // Work in the UI thread
}

GL

其他回答

协同程序会很好地做到这一点

CoroutineScope(Job() + Dispatchers.Main).launch {
                        Toast.makeText(context, "yourmessage",Toast.LENGTH_LONG).show()}

Toast.makeText()只能从Main/UI线程调用。loop . getmainlooper()帮助你实现它:

JAVA

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        // write your code here
    }
});

科特林

Handler(Looper.getMainLooper()).post {
        // write your code here
}

这种方法的优点是您可以在没有活动或上下文的情况下运行UI代码。

你需要在UI线程上创建吐司。请看下面的例子。

runOnUiThread(new Runnable() {
  public void run() {
    Toast.makeText(activity, "YOUR_MESSAGE", Toast.LENGTH_SHORT).show();
  }
});

要显示Toast消息,请参考这篇文章

chicobbird的答案对我很有用。我唯一做的改变是在UIHandler的创建中

HandlerThread uiThread = new HandlerThread("UIHandler");

Eclipse拒绝接受其他任何东西。我想这是有道理的。

uiHandler显然是在某处定义的类全局。我仍然不知道Android是如何做到这一点的,以及正在发生什么,但我很高兴它能工作。现在我将继续研究它,看看我是否能理解Android在做什么,以及为什么一个人必须经历所有这些圆环和循环。chicobbird,谢谢你的帮助。

Rxjava和RxAndroid用户:

public static void shortToast(String msg) {
    Observable.just(msg)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(message -> {
                Toast.makeText(App.getInstance(), message, Toast.LENGTH_SHORT).show();
            });
}