在我的團隊的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);
行代碼來(登錄成功和登錄失敗)
任何幫助解決這個問題將不勝感激:)
我不是很熟悉的replyTo場......但是,它出現在郵件您的replyTo成員爲空。發送原始郵件時,您需要分配它。例如,添加'msg.replyTo = messenger;' – 2012-02-28 20:58:16
如果Gregg的解決方案是正確的,有人可以回答嗎?代碼似乎足夠好,它不使用AIDL或其他複雜的東西... – Radu 2012-03-23 08:12:39
格雷格的答案是正確的。請閱讀此處:http://www.survivingwithandroid.com/2014/01/android-bound-service-ipc-with-messenger.html – 2015-08-12 13:52:57