#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. Спасибо, проблема была в этом. Я использовал код, предоставленный Алексом Гительманом, и это сработало.