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时出现问题,但运行时错误的时间安排并不会导致我相信是这样的。
如果您需要任何代码示例,请发表评论并告诉我们。谢谢:))
答案 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。
希望这会有所帮助......