基本上我想使用异步任务为一个 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,谢谢!
最佳答案
我不建议这样放置 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) {
}
}
您使用弱引用来确保,如果异步任务在您的应用程序被终止时最终处于 Activity 状态,则异步任务不会阻止垃圾收集。
我还注意到这个异步任务称为长操作。您不想在异步任务中执行长时间操作。异步任务的设计应该用于短操作。另外,如果你的 onBindViewHolder() 被多次调用(任何大小合适的回收器 View 通常都会出现这种情况),你将创建大量异步任务,这对性能来说非常糟糕。重新考虑您正在做的事情,几乎总是有更好的方法。
您最好专门为此目的创建一个处理程序和一个处理程序线程(并进行发布)。
关于java - asyncTask 内 viewholder 的 setText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57258388/