关于在Android App上运行线程的致命异常

时间:2016-03-11 14:30:16

标签: java android

03-11 08:50:46.911 8208-8233/? E/AndroidRuntime: FATAL EXCEPTION: MX Notifier
                                             Process: com.example.gec1ply.situationalautonomy, PID: 8208
                                             java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
                                                 at android.os.Handler.<init>(Handler.java:200)
                                                 at android.os.Handler.<init>(Handler.java:114)
                                                 at android.app.Dialog.<init>(Dialog.java:119)
                                                 at android.app.AlertDialog.<init>(AlertDialog.java:200)
                                                 at android.app.AlertDialog$Builder.create(AlertDialog.java:1086)
                                                 at com.bosch.SituationalAutonomy.MainActivity.onCanMessageTimedOut(MainActivity.java:444)
                                                 at com.bosch.Platform.CAN.IO.OBDLink.OBDLinkMXNotifier.run(OBDLinkMXNotifier.java:39)
                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                 at java.lang.Thread.run(Thread.java:818)

这个问题的目标是理解错误,因为我没有想法从哪里开始寻找。特别是因为第一个回调来自Thread.run()

我成功地能够在模拟器上运行此应用程序而不会抛出任何异常,这让我相信该程序可能在连接BlueTooth时出现问题,但运行时错误的时间安排并不会导致我相信是这样的。

如果您需要任何代码示例,请发表评论并告诉我们。谢谢:))

2 个答案:

答案 0 :(得分:0)

您正试图从不是主线程的线程中显示AlertDialog。这样做会导致此错误。获得onCanMessageTimedOut后,您应该向主要帖子发送消息,以便显示您的AlertDialog。如果您引用了Activity,则可以使用runOnUiThread(Runnable)作为示例

答案 1 :(得分:0)

通常在Android等各种平台中,用户界面会在main thread.上呈现。通常会有Queue,其中各种Requests都会排队。 Main thread对此Queue进行连续轮询,使用该请求并在UI上处理该请求。如果任何其他线程试图修改UI元素的状态,则抛出异常。

因此,要使用主Ui线程以外的任何线程进行任何修改,请将消息传递给主UI线程。在框架中像Android一样,提供了一些或其他机制来与来自其他线程的主线程进行通信。我建议你准备好关于Android的Handler.java。您还应该学习AsyncTask。

希望这会有所帮助......