私はソケットからアプリケーションを読み込んでいます。私は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つのオフタスク、ではないのスレッドのためのものではないだろう言ったようにデータを待っています。
どのラインでエラーが表示されますか?私は 'public void run()'を頻繁に使用します(API 24でも)。このシミュレータまたは特定の電話ですか? – Barns