我是socket编程的新手,我已经阅读了几个教程,以了解何时开始。但我对Android UI线程和套接字编程知之甚少。
使用HTTP请求时,您应该在不同的线程中执行操作,以防止UI阻塞并获取ANR。所以我的问题是套接字连接怎么样?它是否与HTTP请求的工作方式相同,其中代码执行停止直到设备获得响应,因此,我必须在后台线程中执行操作以防止ANR?
答案 0 :(得分:1)
是的,套接字连接和读取操作都在阻塞。
答案 1 :(得分:0)
HTTP请求使用TCP作为底层协议,因此它类似于使用套接字。在Android中,如果您在主线程上放置任何网络代码,您将获得此异常NetworkOnMainThreadException
。
这是一个关于如何在Android中安全地发出HTTP请求的示例:
Thread httpThread = new Thread(new Runnable() {
@Override
public void run() {
try {
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
int timeoutConnection = 5000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 7000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse httpResponse = null;
HttpPost httpPost = new HttpPost(url);
httpResponse = httpClient.execute(httpPost);
StatusLine statusLine = httpResponse.getStatusLine();
int statusCode = statusLine.getStatusCode();
System.out.println(statusCode);
if (statusCode == 200) {
//success
}else{
//fail
}
} catch (Exception exception) {
Log.e("", exception.toString());
}
}
});
httpThread.start();
答案 2 :(得分:0)
对于HTTP,您可以使用与Listeners一起使用的异步HTTP库:http://loopj.com/android-async-http/
对于套接字,您可以使用AsyncTask在后台执行操作:Using AsyncTask for android network connection
你不能在主线程上进行网络连接,它会抛出异常,因为它会在应用程序超时时冻结它。