0

私はアプリケーションのチャット機能を作成しています。しかし、私は、メッセージが送信された、またはサーバーの応答のためにまだ衰退しているということをユーザーに示す必要があります。AsyncTask doInBackgroundを実行した後で、recyclerviewの項目を更新するにはどうすればいいですか?

フィールド:私は私のChatActivityクラスにメッセージを送信する方法

List<ChatMessage> chatMessages; 
ChatAdapter chatAdapter; 
RecyclerView chatRecyclerView; 
ImageButton submitMessageBtn; 

この:

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: 私ChatAdapterクラスは、このような設定であります

  public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ChatViewHolder> { 

      private static final int VIEW_TYPE_MESSAGE_THIS_USER = 0; 
      private static final int VIEW_TYPE_MESSAGE_OTHER_USER = 1; 
      private final Activity activity; 
      public List<ChatMessage> chats=new ArrayList<>(); 
      ArrayList<String> usercolor=new ArrayList<>(); 
      Context mContext; 
      View view; 

    public ChatAdapter(List<ChatMessage> chats, Context mContext, Activity activity) { 
       this.chats = chats; 
       this.mContext = mContext; 
       this.activity = activity; 
      } 

      @Override 
      public ChatViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
       mContext = parent.getContext(); 

       if (viewType == VIEW_TYPE_MESSAGE_OTHER_USER) { 
        view = View.inflate(mContext, R.layout.message_item_left, null); 
       } else if (viewType == VIEW_TYPE_MESSAGE_THIS_USER){ 
        view = View.inflate(mContext, R.layout.message_item, null); 
       } 

       return new ChatViewHolder(view,(View.OnLongClickListener)activity); 
      } 

     @Override 
     public void onBindViewHolder(final ChatViewHolder holder, int position){ 
      final ChatMessageResponse m = (ChatMessageResponse) chats.get(position); 
      if (getItemViewType(position) == VIEW_TYPE_MESSAGE_OTHER_USER){ 
       holder.bindToView1(m); 
      } else if (getItemViewType(position) == VIEW_TYPE_MESSAGE_THIS_USER) 
      { 
       holder.bindToView(m); 
      } 
     } 

     @Override 
     public int getItemCount() { 
      return chats.size(); 
     } 

     @Override 
     public int getItemViewType(int position) { 
      return chats.get(position).isYours() ? VIEW_TYPE_MESSAGE_THIS_USER : VIEW_TYPE_MESSAGE_OTHER_USER; 
      } 

    } 

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 誰かが、ビューの参照を取得し、アクティビティのasynctaskでそれを変更したり、アダプタ用のコールバックリスナーを作成するように指示しました。

しかし、私はアイデアを持っていませんいずれかのいずれかを行う方法を理解していただければ幸いです。

+0

doInBackground()の実行後にUIスレッドの変更を行うために、onPostExecute()を実装したいと思うでしょう。 – Carnal

+0

@Carnalはあまり役に立たない。私はすでにrunOnUiThread()を持っています –

+0

runOnUiThreadはAsyncTaskが呼び出されても意味がありません。doInBackgroundはバックグラウンドで実行されます。 onPostExecute実装を追加すると修正されるはずです –

答えて

0

「コールバック」または「インターフェイス」の使用に精通していますか?インターフェースを作成し、アクティビティーに実装することができます。 "AsyncTask"のパラメータでコールバックを渡し、そこで使用します。活動に

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

    void updateAdapter(String result); 
} 

:AsyncTaskの最後に

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); 
    } 
} 

が... AsyncTaskくださいから外部のクラスを作成します!

/** 
* Created by gmora. 
*/ 

public class YourAsyncTaskClass extends AsyncTask<String, Void, String > { 

    private IProcess iProcess; 

    public StarSearchPrinterTask(IProcess pIProcess) { 
     this.iProcess= pIProcess; 
    } 

    @Override 
    protected void onPreExecute() { 
     //loading... its optional 
    } 

    @Override 
    protected String doInBackground(String... interfaceType) { 
     // execute webservice or api and get results.. 

     return results; 
    } 

    @Override 
    protected void onPostExecute(String results) { 
     mIProceso.updateAdapter(results); 
    } 
} 
関連する問題