首页 > 解决方案 > 尽管位于另一个线程中,但代码仍会引发 NetworkOnMainThread 异常

问题描述

我的应用程序中的一件事有问题。当我在调试器中启动应用程序时,它会抛出一个错误 NetworkOnMainThreadException。更具体地说,当在线程(非主线程)中连接到 Web 服务器时会引发异常 com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode (HttpsURLConnectionImpl.java)。因此,应用程序尝试在主线程上进行网络调用,但代码被另一个线程包围。

有问题的代码位于从 onResume 调用的 void 中。下面附上我的代码。

我已经尝试在另一个线程中围绕整个代码,但仍然 - NetworkOnMainThread

final Runnable checker = new Runnable() {
    @Override
    public void run() {
        handler.removeCallbacks(null);
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL endpoint = new URL("###");
                    HttpsURLConnection conn =
                            (HttpsURLConnection) endpoint.openConnection(); //Here it throws mentioned Exception
                    if (conn.getResponseCode() == 200) {
                        InputStream response = conn.getInputStream();
                        String results = iStreamToString(response);
                        if(UserIdResults.equals("0")){
                            handler.postDelayed(this, 5000);
                        }else {
                            //Do Something
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
};
handler.postDelayed(checker, 5000);

标签: javaandroidandroid-studiomobile

解决方案


问题很可能是由这一行引起的:

handler.postDelayed(this, 5000);

如所写,this指的是内部Runnable(您表示为闭包的那个)。这会导致您的网络执行Runnable由 运行Handler,这当然是在主线程上。

您可能打算运行,在这种情况下,checker您应该只使用checker.this


推荐阅读