我有一个从网络获取Object
的方法,然后使用此数据更新UI
。
我使用第三方API来获取数据并接收数据。
下载过程在新的Thread
中完成,并获取并更新UI Thread
中完成的数据。
在我的主线程中:
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
中调用了Main Thread
,但是在DownloaderForRequests
Thread
上调用了该异常。
我添加了一个用于检查当前线程的日志,它表明当发生此异常时它确实不是主线程。
为什么它很少发生,如何测试并修复100%?
我不想使用runOnUiThread
,因为它不会修复我想要检测到的问题并理解问题,而不仅仅是在没有任何理由的情况下添加更多代码。
答案 0 :(得分:0)
您可以检查哪个线程,例如
if (Looper.getMainLooper().getThread() != Thread.currentThread()) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
method();
}
});
}else{
method();
}