【发布时间】:2012-02-28 20:19:44
【问题描述】:
在我团队的 Android 应用程序中,我有一个从启动时运行的服务,它与服务器通信以执行登录、注册、手机之间聊天和更新手机数据库等操作。
我需要让我的服务与活动进行双向通信:例如,我目前正在处理登录活动,用户名和密码是从应用程序屏幕上的文本字段中获取的字符串,我已经能够将它们传递给服务,以便它向服务器发送授权命令。
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;'
-
如果格雷格的解决方案正确,有人可以回答吗?代码看起来已经足够好了,而且它没有使用 AIDL 或其他复杂的东西......
-
格雷格的回答是正确的。在这里阅读:survivingwithandroid.com/2014/01/…
标签: java android service handler messenger