Android中的套接字连接UI线程阻塞?

时间:2014-06-02 12:14:51

标签: java android multithreading sockets

我是socket编程的新手,我已经阅读了几个教程,以了解何时开始。但我对Android UI线程和套接字编程知之甚少。

使用HTTP请求时,您应该在不同的线程中执行操作,以防止UI阻塞并获取ANR。所以我的问题是套接字连接怎么样?它是否与HTTP请求的工作方式相同,其中代码执行停止直到设备获得响应,因此,我必须在后台线程中执行操作以防止ANR?

3 个答案:

答案 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

你不能在主线程上进行网络连接,它会抛出异常,因为它会在应用程序超时时冻结它。