加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Android Service-Activity 2方式通信

发布时间:2020-12-15 02:31:57 所属栏目:Java 来源:网络整理
导读:在我的团队的 Android应用程序中,我有一个从启动运行的服务,它与服务器通信以执行诸如登录,注册,在电话之间聊天和更新电话数据库等操作. 我需要让我的服务与双向活动进行通信:例如,我正在处理登录活动,用户名和密码是从应用程序屏幕上的文本字段中获取的字
在我的团队的 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);

两种情况下的代码行(登录成功和登录失败)

任何帮助解决这个问题将不胜感激:)

解决方法

正如格雷格在评论中指出的那样.你需要设置msg.replyTo = messenger; int他发送原始邮件的地方.

可以在这里找到一个例子:http://www.survivingwithandroid.com/2014/01/android-bound-service-ipc-with-messenger.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读