2017-08-12 11 views
0

私はソケットからアプリケーションを読み込んでいます。私はAPI 18を搭載した電話機でこれをテストしました。 API24の電話機で試してみると、NetworkOnMainThread例外がスローされます。 私は、後のAPIのためにAsyncTaskでこれを行う必要がある、または私は何か間違ったことをしていることを読んだ。私は入力ストリームデータを待っているためにコードを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

どのラインでエラーが表示されますか?私は 'public void run()'を頻繁に使用します(API 24でも)。このシミュレータまたは特定の電話ですか? – Barns

答えて

0

uiスレッドでネットワークを接続しようとすると、まったく最新のアンドロイドAPIが例外をスローします。

唯一の方法は、AsyncTaskを使用するか、Handlerを使用することです。

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

注:ネットワークを使用してUIに表示する場合は、AsyncTaskを使用する必要があります。

関連する問題