以下例外意味着什么;我该怎么解决?
这是代码:
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)
20 回答
首先需要导入给定的行 .
然后,在Activity的
onCreate()
方法中添加以下行:我有同样的问题,我只是通过将Toast放在Asynctask <>的onPostExecute()覆盖函数中来修复它并且它有效 .
更新 - 2016年
最好的替代方法是使用
RxAndroid
(RxJava
的特定绑定)为MVP
中的P
来处理数据 .首先从现有方法返回
Observable
.像这样使用这个Observable -
----------------------------------------------------------------------------------------------------------------------------------
我知道我有点晚了但是到了 . Android基本上适用于两种线程类型,即 UI thread 和 background thread . 根据android文档 -
现在有各种方法可以解决这个问题 .
我将通过代码示例解释它:
runOnUiThread
LOOPER
AsyncTask
处理程序
我遇到了同样的问题,这就是我修复它的方法:
要创建UIHandler,您需要执行以下操作:
希望这可以帮助 .
您需要从UI线程调用
Toast.makeText(...)
:这是从another (duplicate) SO answer复制粘贴的 .
Reason for an error:
工作线程用于执行后台任务,除非您调用类似 runOnUiThread 的方法,否则您无法在工作线程中的UI上显示任何内容 . 如果您尝试在不调用runOnUiThread的情况下在UI线程上显示任何内容,则会出现
java.lang.RuntimeException
.因此,如果您在
activity
但是从工作线程调用Toast.makeText()
,请执行以下操作:上面的代码确保您在
UI thread
中显示Toast消息,因为您在runOnUiThread
方法中调用它 . 所以没有java.lang.RuntimeException
.我得到了这个错误,直到我做了以下事情 .
并将其变成了单例类:
这是因为Toast.makeText()是从工作线程调用的 . 应该像这样从主UI线程调用它
Toast, AlertDialogs 需要在UI线程上运行,你可以使用 Asynctask 在android开发中正确使用它们 . 但有些情况我们需要自定义超时,所以我们使用 Threads ,但在线程中我们不能使用Toast,我们在AsyncTask中使用的Alertdialogs那么我们需要单独的 Handler 来弹出那些 .
在上面的例子中,我希望在3秒内睡眠我的线程,之后我想在你的 mainthread 工具处理程序中显示Toast消息 .
我在这里使用了switch case,因为如果你需要以相同的方式显示不同的消息,你可以在Handler类中使用switch case ...希望这会对你有所帮助
试试这个,当你看到由于Looper没有在handler之前准备好而导致的runtimeException .
要在线程中显示对话框或烤面包机,最简洁的方法是使用Activity对象 .
例如:
你是从工作线程调用它 . 您需要从主线程中调用
Toast.makeText()
(以及处理UI的大多数其他函数) . 例如,您可以使用处理程序 .在文档中查找Communicating with the UI Thread . 简而言之:
Other options:
你可以使用AsyncTask,它适用于在后台运行的大多数事情 . 它有一些钩子,您可以调用它来指示进度,以及何时完成 .
你也可以使用Activity.runOnUiThread() .
当从任何后台线程调用主线程上的某些内容时,通常会发生这种情况 . 让我们看一个例子 .
在上面的示例中,我们在textInview上设置文本,该文本视图位于doInBackground()方法的主UI线程中,该方法仅在工作线程上运行 .
这就是我做的 .
可视组件被“锁定”到来自外部线程的更改 . 因此,由于toast在主屏幕上显示由主线程管理的内容,因此您需要在该线程上运行此代码 . 希望有所帮助:)
Toast.makeText()
应该从Main / UI线程调用 . Looper.getMainLooper()帮助您实现它:此方法的一个优点是您可以在非Activity(或没有Context)类中使用它 .
当我的回调尝试显示对话框时,我遇到了同样的问题 .
我用Activity中的专用方法解决了它 - 在Activity实例成员级别 - 使用
runOnUiThread(..)
对于Rxjava和RxAndroid用户:
我使用以下代码来显示来自非主线程“context”的消息,
然后使用如下:
ChicoBird的答案为我工作 . 我所做的唯一改变是创建了我必须做的UIHandler
Eclipse拒绝接受任何其他内容 . 我想是有道理的 .
此外
uiHandler
显然是某个全局定义的类 . 我仍然没有声称理解Android是如何做到这一点以及发生了什么,但我很高兴它有效 . 现在我将继续研究它,看看我是否能理解Android正在做什么以及为什么必须经历所有这些环节和循环 . 感谢ChicoBird的帮助 .