0

「NetworkOnMainThreadException」が発生しています

AsyncTask から UDP パケットを送信しています、Sensor イベントから送信しています。私の推測では、Sensor イベントはメイン UI スレッドでトリガーされます。

センサーから新しい値が利用可能になったときに UdpPackets を送信したいのですが、センサー イベントから送信できないため、どのような方法が最適ですか?

4

3 に答える 3

2

@RaghavSoodからの答えは確かに堅実です(投票されました)が、回避策を避けるようにしてください. したがって、基本的には、以下は Raghavs の回答の 2. を拡張したものです。

私のソリューションには、センサーデータを収集するキューまたはスタックが含まれ、x 秒ごとに (間隔を狭くしないでください)、AsyncTask を開始してデータをサーバーに送信する必要があります。これには 1 つの利点があります。

  • サーバーへの接続や切断を含むスパム データを防止します。これにより、電話の電力消費が削減され、サーバーがデータであふれないようにする必要があります。

そして1つの欠点:

  • データは送信前に収集されます。つまり、データの送信は即時ではありません。
于 2012-09-23T14:23:59.450 に答える
1
  1. ターゲット SDK を Honeycomm 以下のものに変更するか、StrictMode を無効にします
  2. 新しいスレッドまたは AsyncTask を生成して、データをサーバーに送信します。

ターゲット 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);
于 2012-09-23T13:53:23.917 に答える
0

センサーイベントごとにスレッドを生成するのはあまり良くなく、新しいデータをポーリングする別のスレッドにも問題があります (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();ポーラー スレッドが進行します。

于 2012-09-24T11:10:40.460 に答える