ThreadException - 事件大部分时间发生在UI线程上,但有时发生在另一个线程上

时间:2015-02-27 13:29:16

标签: java android multithreading thread-safety

我有一个从网络获取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,因为它不会修复我想要检测到的问题并理解问题,而不仅仅是在没有任何理由的情况下添加更多代码。

1 个答案:

答案 0 :(得分:0)

您可以检查哪个线程,例如

if (Looper.getMainLooper().getThread() != Thread.currentThread()) {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    method();
                }
            });
        }else{
            method();
        }