2014-10-31 56 views
1

我在创建用于接收消息的处理程序的活动中创建了一个UI。Android:从单独线程发送的消息将obj设置为空

然后我启动第二个线程进行网络通信。第二个线程通过UI线程处理程序将消息发送回UI线程。

只要我发送整数值,所有工作正常。 但是,如果将obj值设置为诸如字符串之类的对象,则当它到达处理程序时,它将被设置为空。

处理程序声明如下:

private static class MsgHandler extends Handler 
{ 
    private CommsActivity m_parent; 

    public MsgHandler(CommsActivity parent) 
    { 
     m_parent = parent; 
    } 

    @Override 
    public void handleMessage(Message msg) 
    { 
     switch(msg.what) 
     { 
      case R.integer.msg_progress : 
       m_parent.ShowProgress(msg.arg1); 
       break; 

      case R.integer.msg_error : 
       m_parent.ShowError(msg.arg1, (String)msg.obj); 
       break; 
     } 
    } 
} 

当我需要从第二个线程发送一个消息,我把它以这种方式:

msg = m_hMsgHandler.obtainMessage(); 
msg.what = m_iNormalMsgId; 
msg.arg1 = R.integer.activation_lockout; 
msg.obj = new String(strResponse); 
msg.sendToTarget(); 

MsgHandler实例传递到该线程可作为参数运行并存储供以后使用。

我也试过使用Bundle实例,但是这也设置为NULL。

请注意,我正在使用Android 4.4。

我需要做些什么来克服这个限制?

+0

您msg.what是m_iNormalMsgId;但你不要在你的交换机上处理它 – pskink 2014-10-31 17:01:26

+0

@Simon - 我使用尽可能多的代码构建了一个示例应用程序,并且该问题不存在。我建议你发布一个完整的SSCCE(http://sscce.org),以帮助他人看到问题。 – EJK 2014-10-31 17:05:34

+0

你是对的 - 找到我的代码中的错误,并纠正它。感谢每一位试图帮助我们的人! – Simon 2014-10-31 17:32:55

回答

0

尝试使用处理程序发送消息。 希望它有助于

msg = m_hMsgHandler.obtainMessage(); 
msg.what = m_iNormalMsgId; 
msg.arg1 = R.integer.activation_lockout; 
msg.obj = new String(strResponse); 
m_hMsgHandler.sendMessage(msg); 

和检查,你确切地处理该邮件(我上你的样品中看到设置msg.what = m_iNormalMsgId但在切换过程中的情况下R.integer.msg_progress像msg.arg1 = R.integer .activation_lockout;)

+0

谢谢@HiXoid,为您评论。刚试过这个,但它仍然将'msg.obj'转换为null。 – Simon 2014-10-31 16:55:16

0

这是我想尝试它:

m_hMsgHandler.sendMessage( 
    m_hMsgHandler.obtainMessage(
     m_iNormalMsgId, 
     R.integer.activation_lockout, 
     0, 
     new String(strResponse) 
); 
+0

我也试过这种方法 - 获取处理类来填充参数本身,认为可能有一些线程安全的对象操作正在完成。仍然没有工作。 – Simon 2014-10-31 16:56:51

+0

疯狂的理论 - 也许这不工作,因为字符串不实施Parcelable?也许尝试将其包装在一个Bundle对象中,并将obj设置为Bundle。尽管如此,你也可以在那个时候使用setData(Bundle)。 – 2014-10-31 17:06:06