okHttp NetworkOnMainThreadException 尽管有新线程

Posted

技术标签:

【中文标题】okHttp NetworkOnMainThreadException 尽管有新线程【英文标题】:okHttp NetworkOnMainThreadException despite to new Thread 【发布时间】: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。为什么它会抛出异常?以及如何解决这个问题?

【问题讨论】:

How do I fix android.os.NetworkOnMainThreadException?的可能重复 OkHttp 可以为您处理线程。使用enqueue() 而不是execute() 【参考方案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 .. 而且您不必担心创建线程不再..

【讨论】:

以上是关于okHttp NetworkOnMainThreadException 尽管有新线程的主要内容,如果未能解决你的问题,请参考以下文章

okhttp和第三方封装好的OKHttp库-okhttp-utils

《OkHttp源码分析》之 OkHttp的缓存管理

Android 开源框架 ( 二 ) 基于OkHttp进一步封装的okhttp-utils介绍

Android OkHttp完全解析 是时候来了解OkHttp了

Android OkHttp完全解析 是时候来了解OkHttp了

OKHttp源码分析