Java ThreadException-事件大部分时间发生在UI线程上,但有时发生在另一个线程上
我有一个方法,从网络中获取一个对象,然后用这个数据更新UI 我使用第三方API获取数据并接收数据。 下载过程在新线程中完成,获取和更新数据在UI线程中完成 在我的主线中:Java ThreadException-事件大部分时间发生在UI线程上,但有时发生在另一个线程上,java,android,multithreading,thread-safety,Java,Android,Multithreading,Thread Safety,我有一个方法,从网络中获取一个对象,然后用这个数据更新UI 我使用第三方API获取数据并接收数据。 下载过程在新线程中完成,获取和更新数据在UI线程中完成 在我的主线中: public void getNetRequest (DownloaderRequest netRequest) { carImage.setBackgroundResource(netRequest.imageResource); } 在85%的情况下,此代码在UI线程上运行,但有时在15%的时间内
public void getNetRequest (DownloaderRequest netRequest) {
carImage.setBackgroundResource(netRequest.imageResource);
}
在85%的情况下,此代码在UI线程上运行,但有时在15%的时间内,我会遇到异常:
[DownloaderForRequests]android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6024)
.
.
.
at java.lang.Thread.run(Thread.java:841)
当我调试它时,我看到getNetRequest在主线程中调用,但异常表示它是在DownloaderForRequests线程上调用的。
我添加了一个日志来检查当前线程,它显示了当这个异常发生时它实际上不是主线程
为什么它很少发生?我如何测试它并100%修复它?
我不想使用runOnUiThread,因为它不会解决问题,我想检测它并理解问题,而不是无缘无故地添加更多代码。您可以检查哪个线程,比如
if (Looper.getMainLooper().getThread() != Thread.currentThread()) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
method();
}
});
}else{
method();
}
我们需要更多的代码来帮助您。看起来您可以使用AsyncTask。请至少为DownloaderRequest提供与线程相关的代码。谢谢您的回答,但我想了解为什么它会在15%的时间内发生,所以我也可以在其他地方修复它。