1

アクティビティとサービス (別のアプリケーションにあります) の間の通信を作成しました。サービスがアクティビティからの呼び出しを受け取ると、新しいスレッドを生成してタスクを実行します。通常、このタスクを完了するには 3 秒かかります。

アクティビティからのメッセージがサービスに届くと、それを保持します。そして、このメッセージの replyTo が null かどうかを確認してください。replyTo が null ではありません。(わかった)

public class RemoteService extends Service{
    ...
    プライベート静的クラス IncomingHandler extends Handler 実装 Observer{       

        プライベート メッセージ msg;

        @オーバーライド
        public void handleMessage(メッセージメッセージ){

            //- 到着メッセージを保持                        
            this.msg = msg;

            //- replyTo の値を確認します
            メッセンジャーの返信先 = msg.replyTo;
            if (返信先 != null)
                Log.d("タグ","返信先 ====///////==== null");
            そうしないと
                Log.d("タグ","返信先 ======== null");                                   

            //- タスクを実行する新しいスレッドを生成します   
            試す{
                CustomThread スレッド = 新しい CustomThread();
                thread.registerObserver(これ);
                スレッド.開始();
            }キャッチ(例外e){
                log.d("タグ",e.getMessage());
            }           
        }

        //- タスクが完了したとき
        @オーバーライド
        public void update(int 結果、文字列値) {

            //- replyTo の値を確認します
            メッセンジャーの返信先 = msg.replyTo;
            if (返信先 != null)
                Log.d("タグ","返信先 ====///////==== null");                           
            そうしないと
                Log.d("タグ","返信先 ======== null");

            //- データを準備する
            バンドル データ = new Bundle();
            data.putString("キー",値);
            メッセージ message = Message.obtain(null,2,0,0);
            message.setData(データ);

            //- メッセージをアクティビティに送信します
            if (replyTo != null) replyTo.send(メッセージ);

        }
}

タスクが完了すると、それをホストするクラスに通知します。メソッドupdateを呼び出します。handleMessageメソッドでは、replyTo は null ではありません。ただし、3 秒後、更新メソッドでは、replyTo が null になり、クラッシュします。

何故ですか?おそらく、IncomingHandler が静的クラスであるためでしょうか? または他にどのような理由がありますか?

4

1 に答える 1

1

Message.obtain(null, ...- これが、replyTo が null である理由です。

于 2013-06-15T21:18:17.330 に答える