1

UDPデータを受け取ったスレッドを実行し、このデータをハンドラを使用してアクティビティに送信するサービスが必要です。私のコードは時々動作しますが、デバッグに感謝していない何らかの理由で失敗する瞬間があります。サービスで実行されているループ内で同じjavaメッセージパラメータを再利用する方法

スレッド

public void run() { 
     //UDP initialize 
     while (true) { 
      //receive UDP packet 
      //set Message obj and what values 
      //send Message to handler 
     } 
} 

活動

protected void onCreate(Bundle savedInstanceState) { 
    //Obtain Message from handler 
} 
+0

元の投稿からすべてのコードを削除したのはなぜですか?私の回答(あなたを助けてくれたと思っています)は現在役に立たなくなっています。 –

答えて

1

あなたは基本的にはすでにキューに入れられているとrequeueingされたオブジェクト内のデータを上書きし、同じMessageオブジェクトを再利用し続けます同じオブジェクトを何度も何度も繰り返します。

このコードは間違っている:

Message msgToActivity = new Message(); 
    DatagramPacket packetIn = new DatagramPacket(receiveData, receiveData.length); 
    while (true) { 
     receiveSocket.receive(packetIn); 
     msgToActivity.obj = new String(receiveData, 0, packetIn.getLength()); 
     msgToActivity.what = 0; 
     LogComActivity.logcomHandler.sendMessage(msgToActivity); 
    } 

あなたは、単一のMessageオブジェクトを作成し、それを修正し、ループ内にキューイングされています。

代わりにこれを行います。

DatagramPacket packetIn = new DatagramPacket(receiveData, receiveData.length); 
    while (true) { 
     receiveSocket.receive(packetIn); 
     Message msgToActivity = Message.obtain(); 
     msgToActivity.obj = new String(receiveData, 0, packetIn.getLength()); 
     msgToActivity.what = 0; 
     LogComActivity.logcomHandler.sendMessage(msgToActivity); 
    } 

このコードは、新しいMessageオブジェクトにループ内の各時刻を取得し、代わりに新しいものを毎回作成するのリサイクルオブジェクトのグローバルプールからMessageオブジェクトを要求します。


また、このコール(handleMessage())内側:

this.obtainMessage(); 

は、あなたが戻っMessageオブジェクトと何もしないと、無用であるあなたは、そのコードを必要としない、それを削除します

。。。
関連する問題