无法在未调用Looper.prepare()的线程内创建处理程序
以下例外意味着什么;我该怎么解决?
这是代码:
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 个回复
弦砂牧扁
(以及处理UI的大多数其他函数)。例如,您可以使用处理程序。 查找与文档中的UI线程进行通信。简而言之:
其他选择: 您可以使用AsyncTask,它适用于在后台运行的大多数事情。它有一些钩子,您可以调用它来指示进度,以及何时完成。 您还可以使用Activity.runOnUiThread()。
鞋扣蚊冈借
:
这是从另一个(重复的)SO答案复制粘贴的。
芜任亮蜡
中的
使用
(特殊绑定为
)来处理数据。 首先从现有方法返回
。
像这样使用这个Observable -
-------------------------------------------------- -------------------------------------------------- ------------------------------ 我知道我有点晚了但是这里去了。 Android基本上适用于两种线程类型,即UI线程和后台线程。根据android文档 - 不要从UI线程外部访问Android UI工具包来解决此问题,Android提供了几种从其他线程访问UI线程的方法。以下列出了可以提供帮助的方法:
现在有各种方法可以解决这个问题。 我将通过代码示例解释它: runOnUiThread
LOOPER 用于为线程运行消息循环的类。默认情况下的线程 没有与之关联的消息循环;创建一个,打电话 prepare()在运行循环的线程中,然后循环()到 让它处理消息,直到循环停止。
的AsyncTask AsyncTask允许您对用户执行异步工作 接口。它在工作线程中执行阻塞操作 然后在UI线程上发布结果,无需您 自己处理线程和/或处理程序。
处理器 Handler允许您发送和处理Message和Runnable对象 与线程的MessageQueue相关联。
览幕堤分
授巨
。 Looper.getMainLooper()帮助您实现它:
此方法的一个优点是您可以在非Activity(或没有Context)类中使用它。
田损比报
要创建UIHandler,您需要执行以下操作:
希望这可以帮助。
襄挟款籍
。 所以,如果你在
但是从工作线程调用
,请执行以下操作:
上面的代码确保您在
中显示Toast消息,因为您在
方法中调用它。所以不再
。
懊毁暗
并将其变成了单例类:
剑哎
可视组件被“锁定”到来自外部线程的更改。 因此,由于toast在主屏幕上显示由主线程管理的内容,因此您需要在该线程上运行此代码。 希望有帮助:)
席酱
甲车劲
Eclipse拒绝接受任何其他内容。我想是有道理的。
显然是一个全局定义的类。我仍然没有声称理解Android是如何做到这一点以及发生了什么,但我很高兴它的工作原理。现在我将继续研究它,看看我是否能理解Android正在做什么以及为什么必须经历所有这些环和循环。感谢ChicoBird的帮助。
靛新比比催
社攻取墟槽
田眯衅
委婪绷冗诉
旗低饶彤
在上面的例子中,我希望在3秒内睡眠我的线程,之后我想在你的mainthread实现处理程序中显示Toast消息。
我在这里使用了switch case,因为如果你需要以相同的方式显示不同的消息,你可以在Handler类中使用switch case ...希望这会对你有所帮助
喷乡顾沥沪
在上面的示例中,我们在textInview上设置文本,该文本视图位于doInBackground()方法的主UI线程中,该方法仅在工作线程上运行。
嘘伪
课刊灭似
然后,在您的活动的
方法中添加以下行:
诫商
然后使用如下: