HttpURLConnection.connect 卡死 死锁怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpURLConnection.connect 卡死 死锁怎么解决相关的知识,希望对你有一定的参考价值。

参考技术A 使用getResponseCode()方法超时了却阻塞了线程,原因是指设置了setConnectTimeout没有设置setReadTimeout参数导致的
setConnectTimeout:设置连接主机超时(单位:毫秒)
setReadTimeout:设置从主机读取数据超时(单位:毫秒)
例如:
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000);本回答被提问者采纳

HttpUrlConnection.connect 失败

【中文标题】HttpUrlConnection.connect 失败【英文标题】:HttpUrlConnection.connect fails 【发布时间】:2020-05-31 15:14:11 【问题描述】:

我一直在尝试创建一个连接到editText中的url并返回状态码的小应用程序。

这里是 onCreate 代码:

 override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    button.setOnClickListener 
        val url = editText.text.toString()
        var connection: HttpURLConnection? = null
        if (URLUtil.isValidUrl(url)) 
            connection = URL(url).openConnection() as HttpURLConnection
            var thr = Thread 
                connection.connect()
                val code = connection.responseCode
                runOnUiThread 
                    if (code != 404 && code != 500) 
                        textView.text = "Ok"
                     else 
                        textView.text = "Failed"
                    
                

            
            thr.start()
            thr.join()
         else 
            textView.text = "Failed"
        
    

问题是只要 URL 有效,.connect() 方法中就会出现运行时错误。上网权限是在 android manifest 中设置的。是什么导致了这个问题?

E/AndroidRuntime: FATAL EXCEPTION: Thread-2
Process: com.example.company.myapplication, PID: 27183
java.net.SocketException: socket failed: EPERM (Operation not permitted)
    at java.net.Socket.createImpl(Socket.java:492)
    at java.net.Socket.getImpl(Socket.java:552)
    at java.net.Socket.setSoTimeout(Socket.java:1180)
    at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:143)
    at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90)
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30)
    at com.example.company.myapplication.MainActivity$onCreate$1$thr$1.run(MainActivity.kt:25)
    at java.lang.Thread.run(Thread.java:919)

【问题讨论】:

你能告诉我们确切的 RuntimeException + stacktrace 吗? 是的,应该从一开始就添加它 可能相关:***.com/questions/56266801/… 您是在模拟器还是实际设备上运行?其他需要模拟器/设备上的应用程序的网络是否可以工作? 让我们continue this discussion in chat。 【参考方案1】:

对于那些没有阅读聊天的人:

URLUtil.isValidUrl(url) 不检查有问题的 url 实际上可以解析到网站/服务器。这意味着当在不存在的网站/服务器上调用 connect 时,会引发异常,因为没有可连接的内容。

【讨论】:

【参考方案2】:

您好,请检查您是否在清单中提供了互联网许可,

<manifest >
 <uses-permission android:name="android.permission.INTERNET" />
 <application> 
  ...
 </application> 
</manifest>

【讨论】:

以上是关于HttpURLConnection.connect 卡死 死锁怎么解决的主要内容,如果未能解决你的问题,请参考以下文章