0

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.

+0

Sie werden onPostExecute() implementieren, um die Änderungen im UI-Thread nach doInBackground() durchgeführt wird. – Carnal

+0

@Carnal, das hilft nicht viel. Ich habe bereits runOnThread() –

+0

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 –

Antwort

0

Kennen Sie die Verwendung von "Callbacks" oder "Interfaces"? Sie können eine Schnittstelle erstellen und in Ihrer Aktivität implementieren. Übergeben Sie den Callback über Parameter in der "AsyncTask" und verwenden Sie ihn dort.

//Interface class 
/** 
* Created by gmora 
*/ 
public interface IProcess { 

    void updateAdapter(String result); 
} 

Auf Aktivität:

public class YourActivity extends AppCompatActivity { 

    private IProcess mProcess; 
    private Adapter mRecyclerAdapter; 
    private RecyclerView mRecyclerView; 
    private List<ChatMessage> chats; //update chats on activity and refresh your adapter 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_layout); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     mProcess = new IProceso() { 
       @Override 
       public void updateAdapter(String pException) { 
        //update chats ... and update mAdater.notifyDataChange()... 
        // or mRecyclerView.setAdapter(new Adpater.... with new list chats).. 
       } 
      }; 

     mRecyclerView = find.... 
     // etc.... 
     mRecyclerAdapter = new RecyclerAdapter(chats, ...); 
     mRecyclerView.setAdapter(mRecyclerAdapter); 
    } 
} 

schließlich auf AsyncTask ... bitte eine externe Klasse von AsyncTask erstellen!

Verwandte Themen