【问题标题】:okHttp NetworkOnMainThreadException despite to new ThreadokHttp NetworkOnMainThreadException 尽管有新线程
【发布时间】:2019-12-11 17:47:49
【问题描述】:

在 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();

}

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

【问题讨论】:

标签: java android exception networking okhttp3


【解决方案1】:

错误是

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

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

【讨论】:

    【解决方案2】:

    你在这里犯了一个巨大的错误..

    new Thread(new Runnable() {
            @Override
            public void run() {
    
            }
        }).run();
    

    您应该在线程上调用start() 来启动而不是run() .. 如果您直接调用run() 那么将没有线程在运行并且您的Thread 将像普通的java 类一样使用普通的方法run()..

    你应该使用

    new Thread(new Runnable() {
        @Override
        public void run() {
    
        }
    }).start();
    

    附带说明一个更好的在 android 中联网的方法,您应该使用 Retrofit .. 它太容易使用了,而且它还在引擎盖下使用了 OkHttp .. 而且您不必担心创建线程不再..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 2017-01-21
      • 1970-01-01
      • 2019-03-24
      • 2020-10-15
      • 1970-01-01
      相关资源
      最近更新 更多