私のチームの 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 フィールドを使用して、リターン メッセンジャーに情報を返送させようとしましたが、アプリを実行すると、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;
ヌルポインターはから来ているようです
msg.replyTo.send(m);
両方の場合のコード行 (ログイン成功とログイン失敗)
この問題を解決するための助けをいただければ幸いです:)