okHttp NetworkOnMainThreadException尽管有新线程

时间:2019-08-03 10:55:54

标签: java android exception networking okhttp3

在android studio项目中,我使用okhttp发送帖子请求。

public void sentRequest(.... ....) {

        RequestBody formBody = new FormBody.Builder().add("number", number).build();
        Request request = new Request.Builder().url(serverBase + API_numberAvailabilityCheck).post(formBody).build();
        call = client.newCall(request);

        new Thread(new Runnable() {
            @Override
            public void run() {
                final HashMap<String, Object> requestResult = new HashMap<>();
                try {
                    final Response response = call.execute();
                } 
                ...........
                ...........
            }
        }).run();

}

但是尽管调用NetworkOnMainThreadException,但我在调用final Response response = call.execute();的行上却抛出了new Thread异常。为什么会抛出异常?以及如何解决?

2 个答案:

答案 0 :(得分:3)

错误是

thread.run()而不是thread.start()

调用run()方法可使代码在同一线程中运行,而无需启动新线程。

答案 1 :(得分:2)

您在这里犯了一个很大的错误..

new Thread(new Runnable() {
        @Override
        public void run() {

        }
    }).run();

您应该在线程上调用start()来启动而不是run() ..如果直接调用run(),那么将没有线程在运行,并且您的Thread会像正常情况一样运行带有常规方法run()的Java类。

您应该使用

new Thread(new Runnable() {
    @Override
    public void run() {

    }
}).start();

另一方面,您应该使用Retrofit ..一种更好的android联网方法。它的方法太容易使用了,它在后台也使用OkHttp。而且您没有担心再创建线程了。