从可运行任务更改为异步任务



我有一个从套接字读取的应用程序。我已经在启用了 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 中无法正常工作。我看到的所有示例都是针对后台的一次性任务,例如下载图片,而不是等待数据的线程。

当您尝试在 ui 线程中连接网络时,所有最新的 androids API 都会抛出异常。

唯一的方法是使用 AsyncTask 或使用 Handler;

final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
//Do something  
}
}); 

注意:如果要使用网络,然后在UI上显示内容,则必须使用AsyncTask。

最新更新