2012-02-28 59 views
4

在我的團隊的Android應用程序我有一個服務運行從啓動與服務器進行通信以執行操作,如登錄,註冊,電話之間的聊天和更新電話數據庫。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字段來獲取返回信使發送信息,但是當我運行該應用程序它強制關閉一個空指針異常,我不知道爲什麼會發生這種情況。下面是這似乎是罪魁禍首代碼:

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; 

空指針似乎是在兩種情況下,

msg.replyTo.send(m); 

行代碼來(登錄成功和登錄失敗)

任何幫助解決這個問題將不勝感激:)

+0

我不是很熟悉的replyTo場......但是,它出現在郵件您的replyTo成員爲空。發送原始郵件時,您需要分配它。例如,添加'msg.replyTo = messenger;' – 2012-02-28 20:58:16

+0

如果Gregg的解決方案是正確的,有人可以回答嗎?代碼似乎足夠好,它不使用AIDL或其他複雜的東西... – Radu 2012-03-23 08:12:39

+1

格雷格的答案是正確的。請閱讀此處:http://www.survivingwithandroid.com/2014/01/android-bound-service-ipc-with-messenger.html – 2015-08-12 13:52:57

回答