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 卡死 死锁怎么解决的主要内容,如果未能解决你的问题,请参考以下文章