簡體   English   中英

setText用於asyncTask中的viewholder

[英]setText for viewholder inside asyncTask

基本上我想使用asynctask為一個textview設置文本,但是我不知道如何做到這一點,這是我到目前為止所做的

public void onBindViewHolder(final ViewHolder holder, final int position) {
        final ChatMessage msg = mMessagesList.get(position);
        holder.messageTextView.setText(msg.getMessage());

        new LongOperation().execute();


    }




    private class LongOperation extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... str) {

            return null;
        }

        @Override
        protected void onPostExecute(String result) {
        }

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }
    }

我想在asyncTask而不是onBindViewHolder中擁有messageTextView的setText,謝謝!

只需在onPostExecute塊內設置setText ,然后再生成類似messageTextView.setText(result); string messageTextView.setText(result); 希望它能工作。 如果找不到綁定的view ,請使用presenter / callbacks / interface

我不建議這樣放置asynctask。

public void onBindViewHolder(final ViewHolder holder, final int position) {

    final ChatMessage msg = mMessagesList.get(position);
    holder.messageTextView.setText(msg.getMessage());

    new LongOperation(holder,msg.getMessage()).execute();


}




private class LongOperation extends AsyncTask<String, Void, String> {

    private WeakReference<ViewHolder> holder; 
    private String message;      

    LongOperation(ViewHolder viewholder, String message){
        holder = new WeakReference<ViewHolder>(viewholder);
        this.message = message;
    }
    @Override
    protected String doInBackground(String... str) {
        //do all your background stuff here
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        if(holder.get() != null){
            holder.get().messageTextView.setText(message);
        }
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onProgressUpdate(Void... values) {
    }
}

您使用弱引用來確保如果在殺死應用程序時異步任務最終仍然處於活動狀態,則異步任務不會阻止垃圾回收。

我還注意到,這個異步任務稱為長時間操作。 您不想在異步任務中進行長時間的操作。 設計上的異步任務應該用於短期操作。 同樣,如果您的onBindViewHolder()被調用了很多(任何大小合適的recyclerview通常都是這種情況),那么您將創建很多異步任務,這實際上對性能不利。 重新考慮您在做什么,幾乎總是有一種更好的方法。

您可能最好為此創建一個處理程序和一個處理程序線程(並進行發布)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM