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 开发的新手,我想知道:
这两种阅读方式有什么区别?
第一个被写成 AsyncTask
而第二个被写成 运行 作为单独的线程。哪一个是正确的做法?
有没有更好的方式读取socket? (例如,使用非阻塞套接字、回调、使用任何流行的第三方库等)
- What is difference between these two ways of reading?
第二种方法使用了BufferedReader,它有一个内部缓冲机制,可以让你写更少的代码。
- 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
- 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
支持。
我正在尝试绕过 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 开发的新手,我想知道:
这两种阅读方式有什么区别?
第一个被写成
AsyncTask
而第二个被写成 运行 作为单独的线程。哪一个是正确的做法?有没有更好的方式读取socket? (例如,使用非阻塞套接字、回调、使用任何流行的第三方库等)
- What is difference between these two ways of reading?
第二种方法使用了BufferedReader,它有一个内部缓冲机制,可以让你写更少的代码。
- 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
- 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
支持。