[英]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.