Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ThreadException-事件大部分时间发生在UI线程上,但有时发生在另一个线程上_Java_Android_Multithreading_Thread Safety - Fatal编程技术网

Java ThreadException-事件大部分时间发生在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%的时间内

我有一个方法,从网络中获取一个对象,然后用这个数据更新UI

我使用第三方API获取数据并接收数据。 下载过程在新线程中完成,获取和更新数据在UI线程中完成

在我的主线中:

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%的时间内发生,所以我也可以在其他地方修复它。