2012-02-28 13 views
4

私は電話の間でチャットや電話のデータベースを更新し、登録し、ログインなどの操作を実行するためにサーバーと通信し、ブートから実行されているサービスがあります。Androidのサービス-活動2ウェイ通信

サービスを双方向でアクティビティと通信する必要があります。たとえば、現在のところログインアクティビティに取り組んでいます。ユーザー名とパスワードは、アプリケーション画面のテキストフィールドから取得した文字列です。サーバーに認証コマンドを送信するためにサービスに渡すことができます。

public void loginPressed(View v){ 
    usernameStr = usernameField.getText().toString(); 
    passwordStr = passwordField.getText().toString(); 

    if (!bound) return; 
    Bundle b = new Bundle(); 
    Message msg = Message.obtain(null, ChatService.LOGIN); 
    try { 
     b.putString("username", usernameStr); 
     b.putString("password", passwordStr); 
     msg.setData(b); 
     messenger.send(msg); 
    } 
    catch (RemoteException e) { 

    } 

これは私の予想通りです。サーバはログインが成功でいたかどうかというメッセージで応答したとき、私は成功した場合の主な活動を開始するか、そうでない場合は再入国の入力を求めることができるように、私は戻って活動へのメッセージを渡すためにそれを必要とします。

返信メッセンジャーに情報を返すためにmsg.replyToフィールドを使用しようとしましたが、アプリケーションを実行すると強制的にnullポインタ例外が発生し、なぜこれが起こっているのかわかりません。ここでは犯人であると思われるコードは次のとおりです。

private class IncomingHandler extends Handler { 
    @Override 
    public void handleMessage(Message msg) { 
     switch(msg.what) { 
     case LOGIN: 

      Bundle b = msg.getData(); 
      String username = b.getString("username"); 
      String password = b.getString("password"); 

      String loginMessage = TCPCall.login(username, password); 
      connection.sendMessage(loginMessage); 

      String loginReturn = connection.retrieveMessage(); 
      Message m; 

      Scanner s = new Scanner(loginReturn); 
      s.useDelimiter(","); 
      String c = s.next(); 
      String status = s.next(); 
      String message = s.next(); 

      if (status.equals("OK")) { 
       m = Message.obtain(null, LoginActivity.OK); 
       try { 
        msg.replyTo.send(m); 
       } catch (RemoteException e) {} 
      } 
      else { 
       m = Message.obtain(null, LoginActivity.ERR); 
       try { 
        msg.replyTo.send(m); 
       } catch (RemoteException e) {} 
      } 
      break; 

NULLポインタは両方のケースでは、コードの

msg.replyTo.send(m); 

ラインから来ているようだ(失敗した成功してログインログイン)

が この問題を解決するために

任意の助けいただければ幸いです:)

+0

私はreplyToフィールドに精通していないです...しかし、メッセージのあなたのreplyToメンバーがnull表示されます。元のメッセージを送信するときに割り当てる必要があります。たとえば、 'msg.replyTo = messenger;'を追加します。 –

+0

グレッグの解決策が正しい場合、誰かが答えてくれますか?コードは十分に良いようで、それはAIDLやその他の複雑なものを使用していません... – Radu

+1

グレッグの答えは正しいです。ここで読む:http://www.survivingwithandroid.com/2014/01/android-bound-service-ipc-with-messenger.html –

答えて

関連する問題