我从套接字中读取了应用。我已在使用API 18的手机上对此进行了测试。如果我在使用API 24的手机上试用它会引发NetworkOnMainThread
异常。
我已经知道我需要在AsyncTask
中为后来的API做这件事,或者我做错了其他事情。我不确定我需要将代码转换为AsyncTask
,以便我等待输入流数据?
这是我的读取输入流类。
class receiveData extends Thread {
private volatile boolean exit = false;
DataInputStream in;
byte[] fullBuffer = new byte[7];
byte[] buffer = new byte[100];
int bytes; // bytes returned from read()
int bytesCount = 0;
public void run(){
try {
if (socket.isConnected()) {
in = new DataInputStream(socket.getInputStream());
}
} catch(Exception e) {
Log.d(TAG, "in receiveData - run exception - " + e.toString());
}
while(!exit) {
try {
bytes = in.read(buffer);
System.arraycopy(buffer, 0, fullBuffer, bytesCount, bytes);
bytesCount = bytesCount + bytes;
if (bytesCount >= 7) {
h.obtainMessage(NOW_DATA_RECEIVED, bytesCount, -1, fullBuffer).sendToTarget(); // Send to message queue Handler
bytesCount = 0;
} else {
Log.d(TAG, "Receive Error");
bytesCount = 0;
}
} catch(Exception e) {
Log.d(TAG, "Read Error - " + e.toString());
}
}
}
public void stopRdThread() {
exit = true;
try {
socket.close();
} catch(Exception e) {
Log.d(TAG, "error closing socket - " + e.toString());
}
}
/* Call this from the main activity to send data to the remote device */
public void write(byte[] message) {
try {
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(message);
out.flush();
} catch (IOException e) {
Log.d(TAG, "...Error data send: " + e.getMessage() + "...");
}
}
}
我是这样开始的。
private receiveData rd;
// start receiver thread
rd = new receiveData();
rd.start();
就像我说它在API 18中工作得很好但在API 24中不太好。我所见过的所有例子都是在后台执行一项任务,例如下载图片,不是等待数据运行的线程。
答案 0 :(得分:0)
当您尝试在ui线程中连接网络时,所有最新的机器人API都会抛出异常。
唯一的方法是使用AsyncTask或使用Handler;
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
//Do something
}
});
注意:如果您想使用网络然后在UI上显示内容,那么您必须使用AsyncTask。