2012-02-28 8 views
4

내 팀 안드로이드 응용 프로그램 로그인, 등록, 전화 채팅 및 전화 데이터베이스 업데이트와 같은 작업을 수행하기 위해 서버와 통신하는 부팅 서비스가 있습니다.안드로이드 서비스 - 활동 양방향 통신

내 서비스가 양방향으로 활동과 통신하도록해야합니다. 예를 들어 현재 로그인 활동을하고 있으며 사용자 이름과 비밀번호는 응용 프로그램 화면의 텍스트 필드에서 가져온 문자열입니다. 인증 명령을 서버에 전송할 수 있도록 서비스에 전달할 수 있습니다.

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 포인터 예외가 발생하고 이유를 알 수 없습니다. 두 경우 모두에서 코드의

msg.replyTo.send(m); 

라인에서 오는 될

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; 

널 포인터가 보인다 (성공적인 로그인 및 로그인 실패)

다음은 범인 것으로 보인다 코드입니다

이 문제를 해결하는 데 도움이 될 것입니다 :

+0

나는 ReplyTo의 필드에 익숙하지 않다 ...하지만 :

는 여기에서 찾을 수 있습니다. 원본 메시지를 보낼 때 지정해야합니다. 예를 들어 'msg.replyTo = messenger;'를 추가하십시오. –

+0

Gregg의 해결책이 맞으면 누군가 대답 해 줄 수 있습니까? 코드가 충분 해 보입니다. AIDL이나 기타 복잡한 물건을 사용하지 않습니다. – Radu

+1

Gregg의 대답은 정확합니다. 여기에서 읽기 : http://www.survivingwithandroid.com/2014/01/android-bound-service-ipc-with-messenger.html –

답변