Android:从套接字读取数据的最佳做法

时间:2016-02-23 07:28:06

标签: android sockets android-asynctask android-networking

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

所以我从socket中读取了这些代码片段。 (顺便说一句,我已经从投票的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. 有没有更好的方法从套接字读取? (例如使用非阻塞套接字,回调,使用任何流行的第三方库等。)

1 个答案:

答案 0 :(得分:1)

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

第二种方法使用BufferedReader,它具有内部缓冲机制,可以减少代码编写。

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

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

  
      
  1. 有没有更好的方法从套接字读取? (例如使用非阻塞套接字,回调,使用任何流行的第三方库等。)
  2.   

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