Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android中是否存在套接字连接UI线程阻塞?_Java_Android_Multithreading_Sockets - Fatal编程技术网

Java Android中是否存在套接字连接UI线程阻塞?

Java Android中是否存在套接字连接UI线程阻塞?,java,android,multithreading,sockets,Java,Android,Multithreading,Sockets,我是socket编程新手,我读过几篇教程,想知道什么时候开始。但我对Android UI线程和套接字编程知之甚少 当使用HTTP请求时,您应该在不同的线程中执行该操作,以防止UI阻塞和获取ANR。所以我的问题是,套接字连接怎么样?它的工作原理是否与HTTP请求相同,在HTTP请求中,代码执行将停止,直到设备得到响应,因此,我必须在后台线程中执行操作以防止ANR?是的,套接字连接和读取操作被阻塞。HTTP请求使用TCP作为底层协议,因此它与使用套接字类似。在Android中,如果在主线程上放置任何

我是socket编程新手,我读过几篇教程,想知道什么时候开始。但我对Android UI线程和套接字编程知之甚少


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

是的,套接字连接和读取操作被阻塞。

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();

对于HTTP,您可以使用异步HTTP库,这些库与侦听器一起工作:

对于套接字,可以使用AsyncTask在后台执行以下操作:


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

使用HTTP请求基本上与套接字连接相同。HTTP请求建立TCP连接,然后发送一些文本,这些文本可以被了解HTTP协议的程序理解。因此,发送和接收数据包以及处理数据包数据将在工作时阻塞您的应用程序。这同样适用于套接字连接。因此,您应该始终在单独的线程中进行连接。编辑:我想不出在处理网络流量时不应该使用线程的任何应用程序(Android或NoT),所以至少可以考虑使用好线程。