Android: 从套接字读取数据的最佳实践

Android: Best practice to read data from socket

我正在尝试绕过 Android 中的套接字。特别是我想知道从套接字读取数据并将其呈现给 UI 的最佳做法是什么。 据我了解,我们不能在主线程 UI 中调用读取数据,因为它是一个阻塞操作。

所以我得到了这些从套接字读取数据的代码片段。 (顺便说一句,我从投票的 SO 问题中挑选了这些片段):

This...

            SocketAddress sockaddr = new InetSocketAddress("192.168.1.1", 80);
            nsocket = new Socket();
            nsocket.connect(sockaddr, 5000); //10 second connection timeout
            if (nsocket.isConnected()) { 
                nis = nsocket.getInputStream();
                nos = nsocket.getOutputStream();
                Log.i("AsyncTask", "doInBackground: Socket created, streams assigned");
                Log.i("AsyncTask", "doInBackground: Waiting for inital data...");
                byte[] buffer = new byte[4096];
                int read = nis.read(buffer, 0, 4096); //This is blocking
                while(read != -1){
                    byte[] tempdata = new byte[read];
                    System.arraycopy(buffer, 0, tempdata, 0, read);
                    publishProgress(tempdata);
                    Log.i("AsyncTask", "doInBackground: Got some data");
                    read = nis.read(buffer, 0, 4096); //This is blocking
                }

this...

            clientSocket        =   new Socket(serverAddr, port);
            socketReadStream    =   new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String line     =   null;
            String stringToSend =   "This is from client ...Are you there???";

            //Write to server..stringToSend is the request string..
            this.writeToServer(stringToSend);

            //Now read the response..
            while((line = socketReadStream.readLine()) != null){
                Log.d("Message", line);

作为 android 开发的新手,我想知道:

  1. 这两种阅读方式有什么区别?

  2. 第一个被写成 AsyncTask 而第二个被写成 运行 作为单独的线程。哪一个是正确的做法?

  3. 有没有更好的方式读取socket? (例如,使用非阻塞套接字、回调、使用任何流行的第三方库等)

  1. What is difference between these two ways of reading?

第二种方法使用了BufferedReader,它有一个内部缓冲机制,可以让你写更少的代码。

  1. First one was written as AsyncTask while second one was intended to run as separate thread. Which one is correct approach?

AsyncTask 是Thread 的包装器,使用AsyncTask 可以在后台线程中进行网络操作并将结果发布到ui thread.AsyncTask 还管理Thread 池,在某些情况下,您不需要每次创建一个新线程。建议在Android.

中使用AsyncTask
  1. Is there any better way to read from socket? (e.g. using non-blocking sockets, callbacks, using any popular third party library etc.)

您可以使用 Square 的 okio,它是 java 更好的 IO 库,并且有 Buffer 支持。