Ich erstelle eine Chat-Funktion für eine Anwendung und es funktioniert super gut. Aber ich möchte dem Benutzer zeigen, dass die Nachricht gesendet wurde oder die Antwort des Servers noch wartet.Wie wird ein Element in einer Recycleransicht aktualisiert, nachdem AsyncTask doInBackground ausgeführt wurde?
Felder:
List<ChatMessage> chatMessages;
ChatAdapter chatAdapter;
RecyclerView chatRecyclerView;
ImageButton submitMessageBtn;
dieses, wie ich eine Nachricht auf meinem ChatActivity Klasse senden:
public void submitMessage(final String messageType, final byte[] message){
final ChatMessageResponse messageObject = new ChatMessageResponse();
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
messageObject.setMessage(message);
messageObject.setYours(true);
messageObject.setUserNickname(getNickname());
messageObject.setCreationDate(DateTime.now().withZone(DateTimeZone.UTC));
messageObject.setType(messageType);
AddMessage(messageObject);
}
@Override
protected Void doInBackground(Void... voids) {
try {
chatClient.chat().sendMessage(eventId, messageType, message);
runOnUiThread(new Runnable() {
@Override
public void run() {
// Update message on the list after has been sent to server
}
});
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}.execute();
}
public void AddMessage(ChatMessage message)
{
chatMessages.add(message);
chatAdapter.notifyDataSetChanged();
chatRecyclerView.scrollToPosition(chatMessages.size() -1);
}
When message is immediatly added to the adapter it should look like this: meine ChatAdapter Klasse ist Setup wie folgt aus:
When the server's response is positive the views in the ChatViewHolder (that I don't show the code because is too long) should change visibility state Jemand hat mir gesagt, ich soll eine Referenz für die Ansicht bekommen und sie für die Asynchronität der Aktivität ändern oder einen Callback-Listener für meinen Adapter erstellen.
Aber ich habe keine Idee, wie man entweder eine von dann jede Hilfe wird geschätzt.
Sie werden onPostExecute() implementieren, um die Änderungen im UI-Thread nach doInBackground() durchgeführt wird. – Carnal
@Carnal, das hilft nicht viel. Ich habe bereits runOnThread() –
runOnUiThread bedeutet nichts, sobald die AsyncTask aufgerufen wird, doInBackground tut genau das, was es sagt: läuft im Hintergrund. Hinzufügen onPostExecute Implementierung sollte es beheben –