onProgressUpdate
должен вызываться явно из doInBackground, как видно здесь .Это не правильный метод для использования в вашем случае.Я предпочел бы ожидать, что настройка текстового поля должна быть сделана в onPostExecute .Причина в том, что значение newConverstion
определяется сразу после удаленного вызова, и для его завершения может потребоваться некоторое время.Если вы делаете это до того, как асинктическая задача завершит выполнение, вы рискуете NPE.
Редактировать Добавление некоторого кода:
public class Messager extends AsyncTask<SocketAndEditText, Void, Void> {
//skipping some field declaration
@Override
protected Void doInBackground(SocketAndEditText... soEd) {
// get the text that they contain and add the new messages to the old ones
//host = soEd[0].getHost();
//port = soEd[0].getPort();
messageBoard = soEd[0].getMessageBoard();
sendMessage = soEd[0].getSendMessage();
message = sendMessage.getText().toString();
sendMessage(message); //NOTE: added the remote call in the background method. This is the only thing that really SHOULD be done in background.
String conversation = messageBoard.getText().toString();
newConverstion = conversation.concat("\n[You] ").concat(message);
return null;
}
protected void onPostExecute(Void result) {
// make the messages text view editable
messageBoard.setFocusable(true);
messageBoard.setText(newConverstion); // add the new message to the text view
messageBoard.setFocusable(false); // make the messages text view not editable
// erase the text on the second text view that has just been sent
sendMessage.setText("");
}
В основном, самое важное - это разместить наиболеетрудоемкие звонки в фоновом режиме задачи.В вашем случае это sendMessage.С этого момента вы можете делать любые исправления, которые пожелаете, в postExecute и preExecute.Я не совсем уверен, каково было ваше намерение для onProgressUpdate.Я только что перевел это на использование onPostExecute.Если вам нужно временно отключить это поле, вы можете отключить его в onPreExecute и включить его на PostExecute.