我正试图绕过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开发的新手,我想知道:
这两种阅读方式有什么区别?
第一个被写为AsyncTask
而第二个被打算作为单独的线程运行。哪一个是正确的方法?
有没有更好的方法从套接字读取? (例如使用非阻塞套接字,回调,使用任何流行的第三方库等。)
答案 0 :(得分:1)
- 这两种阅读方式有什么区别?
醇>
第二种方法使用BufferedReader,它具有内部缓冲机制,可以减少代码编写。
- 第一个被写为AsyncTask而第二个被打算作为单独的线程运行。哪一个是正确的方法?
醇>
AsyncTask是Thread的包装器,使用AsyncTask可以在后台线程中进行网络操作并在ui thread中发布结果.AsyncTask还管理线程池,在某些情况下,您不需要每次都创建新线程。建议在Android中使用AsyncTask。
- 有没有更好的方法从套接字读取? (例如使用非阻塞套接字,回调,使用任何流行的第三方库等。)
醇>
你可以使用Square的okio,它是一个更好的java IO库,并且有Buffer
支持。