从runnable更改为异步任务

时间:2017-08-12 18:29:08

标签: java android multithreading asynchronous

我从套接字中读取了应用。我已在使用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中不太好。我所见过的所有例子都是在后台执行一项任务,例如下载图片,不是等待数据运行的线程。

1 个答案:

答案 0 :(得分:0)

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

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

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

注意:如果您想使用网络然后在UI上显示内容,那么您必须使用AsyncTask。