2011-05-28 79 views
2

我有一个textview,其中我用两种方式追加文本: 第一种方法:单击按钮并获取EditText中的内容。Android不会向文本视图中正确添加()文本

sendbutton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       txview.append("Text: "+txedit.getText()+"\n"); 
       txedit.setText(""); 

} 
      }); 

这工作正常,当我点击按钮textview更新与新文本的视图。

BUT

的第二种方式,我听XMPP监听器(asmack库)和上recieving消息我将其追加到TextView的。

chat = xmpp.getChatManager().createChat(contactid[1], new MessageListener() { 
       public void processMessage(Chat chat, Message message) {  
        try { 
         chat.sendMessage(message.getBody()); 
        } catch (XMPPException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        }    txview.append("Text"+message.getFrom()+"\n"+message.getBody()+"\n");    }              } 
      );; 

的问题是,我收到消息,我知道它肯定(因为我它重新发送到与chat.sendMessage(message.getBody())的用户),BUT的TextView仅在我更改视图或将应用程序置于后台(单击主页按钮)并将其重新放回到前台后才显示我的消息。

我试过 在每个视图上调用invalidate(),根本不起作用。

是否有任何解决方案或其他方式来做我即将做的事情?

回答

8

通过执行以下技巧,您可以在GUI线程上实现发布。 将您的上下文(活动或服务)传递给您的监听器。听众内:

Handler h = new Handler(context.getMainLooper()); 

h.post(new Runnable() { 
    @Override 
    public void run() { 
     txview.append("Text"+message.getFrom()+"\n"+message.getBody()+"\n"); 
    } 
}); 
+0

感谢您的代码,想检查文档,但你来到这里有一个很好的答案。但我认为生病无论如何读取documentaion =) – artouiros 2011-05-28 06:46:27

+1

您也可以在GUI线程中创建Handler并将其传递给您的监听器。但我从来没有尝试过。 – 2011-05-28 06:49:26

+0

textView.append(“text”); textView.postDelayed(null,0); – 2016-08-18 15:57:06

1

你确定在第二个例子中,在GUI线程上调用processMessage(Chat,Message)方法吗?如果没有,那就是你的问题。切勿触摸非GUI线程的GUI。几乎没有GUI喜欢那样。

+0

你会在这种情况下建议什么? – artouiros 2011-05-28 05:03:46

+0

从GUI线程调用txcview.append。 – Hyperboreus 2011-05-28 05:07:09

+0

很难,因为我需要在听众得到消息时调用append(),唯一的方法是在lsitener中调用 – artouiros 2011-05-28 05:16:36