Android не добавляет () текст в textview должным образом

#java #android #textview

#java #Android #textview

Вопрос:

У меня есть textview, в котором я добавляю текст двумя способами: Первый способ: нажав кнопку и получив то, что находится в EditText.

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

 }
          });
  

И это работает нормально, когда я нажимаю кнопку textview, обновляет представление новым текстом.

НО

Второй способ, я слушаю xmpp listener (библиотеку asmack) и при получении сообщения добавляю его в 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());) , НО textview показывает мои сообщения только после того, как я изменяю вид или переводлю приложение в фоновый режим (нажимая кнопку home), а затем возвращаю его на передний план.

То, что я пытался вызвать invalidate () в каждом представлении, вообще не работает.

Это какое-либо решение или другой способ сделать то, что я делаю?

Ответ №1:

Вы можете добиться публикации в потоке GUI, выполнив следующий трюк. Передайте ваш контекст (действие или сервис) вашему слушателю. Внутренний слушатель:

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

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

Комментарии:

1. Спасибо за код, хотел проверить документацию, но вы пришли сюда с хорошим ответом. но я думаю, что я все равно прочитаю documentaion =)

2. Вы также можете создать обработчик в потоке GUI и передать его вашему слушателю. Но я никогда не пробовал это.

3. TextView.append(«текст»); TextView.postDelayed(null, 0);

Ответ №2:

Вы уверены, что во втором примере метод ProcessMessage (чат, сообщение) вызывается в потоке GUI? Если нет, то это ваша проблема. Никогда не прикасайтесь к GUI из потока, отличного от GUI. Почти ни одному графическому интерфейсу это не нравится.

Комментарии:

1. и что бы вы предложили в этой ситуации?

2. это довольно сложно, потому что мне нужно вызвать append () именно тогда, когда слушатель получает сообщение, и единственный способ — вызвать внутри lsitener

3. Это не единственный способ. Если он действительно выполняется в потоке, отличном от вашего пользовательского интерфейса, существует множество возможностей для обмена данными между потоками. Взгляните на асинхронные примеры в документации Android.

4. Спасибо, проблема была в этом. Я использовал код, предоставленный Алексом Гительманом, и это сработало.