「NetworkOnMainThreadException」が発生しています
AsyncTask から UDP パケットを送信していますが、Sensor イベントから送信しています。私の推測では、Sensor イベントはメイン UI スレッドでトリガーされます。
センサーから新しい値が利用可能になったときに UdpPackets を送信したいのですが、センサー イベントから送信できないため、どのような方法が最適ですか?
「NetworkOnMainThreadException」が発生しています
AsyncTask から UDP パケットを送信していますが、Sensor イベントから送信しています。私の推測では、Sensor イベントはメイン UI スレッドでトリガーされます。
センサーから新しい値が利用可能になったときに UdpPackets を送信したいのですが、センサー イベントから送信できないため、どのような方法が最適ですか?
@RaghavSoodからの答えは確かに堅実です(投票されました)が、回避策を避けるようにしてください. したがって、基本的には、以下は Raghavs の回答の 2. を拡張したものです。
私のソリューションには、センサーデータを収集するキューまたはスタックが含まれ、x 秒ごとに (間隔を狭くしないでください)、AsyncTask を開始してデータをサーバーに送信する必要があります。これには 1 つの利点があります。
そして1つの欠点:
ターゲット SDK の変更:
<uses-sdk android:minSdkVersion="<your-minimum>" android:targetSdkVersion="9" /> //9 is GB
StrictMode を無効にする:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
センサーイベントごとにスレッドを生成するのはあまり良くなく、新しいデータをポーリングする別のスレッドにも問題があります (WarrenFaith の回答)。
このように、別のスレッド内の無限ループであるCyclicBarrierを使用することになりました
running = true;
worker = new Thread(new Runnable() {
public void run(){
while(running) {
try {
sync.await();
Send();
} catch(Exception e) {}
}
socket.disconnect();
}
});
worker.start();
スレッドはsync.await();
行で停止します
センサーから新しいデータが利用可能になるまで
SensorEventListener allListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
if(sendOrientation) {
float R[] = new float[9];
float I[] = new float[9];
boolean success = sensorManager.getRotationMatrix(R, I, acc, mag);
if (success) {
SensorManager.getOrientation(R, orientation);
}
}
if(sync.getNumberWaiting() > 0)
sync.reset();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
が呼び出され、sync.reset();
ポーラー スレッドが進行します。