Java asyncTask中viewholder的setText
基本上,我想使用asynctask为一个textview设置文本,但我不知道怎么做,这就是我到目前为止所做的Java asyncTask中viewholder的setText,java,android,android-asynctask,Java,Android,Android Asynctask,基本上,我想使用asynctask为一个textview设置文本,但我不知道怎么做,这就是我到目前为止所做的 public void onBindViewHolder(final ViewHolder holder, final int position) { final ChatMessage msg = mMessagesList.get(position); holder.messageTextView.setText(msg.getMessage());
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) {
}
}
public void onBindViewHolder(最终视图持有人,最终int位置){
final ChatMessage msg=mMessagesList.get(位置);
holder.messageTextView.setText(msg.getMessage());
新的长操作().execute();
}
私有类LongOperation扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…str){
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onProgressUpdate(void…值){
}
}
我想将messageTextView的setText放在asyncTask中,而不是放在onBindViewHolder中,谢谢 只需在
onPostExecute
块内setText
,其结果为string
likemessageTextView.setText(结果)代码>。希望它能起作用。
如果找不到要绑定的视图
,请使用presenter/callbacks/interface仅在onPostExecute
块中的setText
,使用结果字符串
likemessageTextView.setText(结果)代码>。希望它能起作用。
如果找不到要绑定的视图
,请使用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) {
}
}
public void onBindViewHolder(最终视图持有人,最终int位置){
final ChatMessage msg=mMessagesList.get(位置);
holder.messageTextView.setText(msg.getMessage());
新的长操作(holder,msg.getMessage()).execute();
}
私有类LongOperation扩展了异步任务{
私人参考持有人;
私有字符串消息;
长操作(ViewHolder ViewHolder,字符串消息){
holder=新的WeakReference(视图持有者);
this.message=消息;
}
@凌驾
受保护的字符串doInBackground(字符串…str){
//在这里做你所有的背景资料
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
if(holder.get()!=null){
holder.get().messageTextView.setText(消息);
}
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onProgressUpdate(void…值){
}
}
您可以使用weakreference来确保,如果异步任务在应用程序被终止时仍处于活动状态,则异步任务不会阻止垃圾收集
我还注意到这个异步任务被称为长操作。您不希望在异步任务中执行长操作。异步任务按设计应该用于短操作。此外,如果onBindViewHolder()被大量调用(通常情况下,任何大小合适的recyclerview都会被调用),那么您将创建大量异步任务,这对性能非常不利。重新考虑一下你在做什么,几乎总有更好的方法
您最好创建一个处理程序和一个专门用于此目的的处理程序线程(并执行post) 我不建议把异步任务放在那样的位置
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) {
}
}
public void onBindViewHolder(最终视图持有人,最终int位置){
final ChatMessage msg=mMessagesList.get(位置);
holder.messageTextView.setText(msg.getMessage());
新的长操作(holder,msg.getMessage()).execute();
}
私有类LongOperation扩展了异步任务{
私人参考持有人;
私有字符串消息;
长操作(ViewHolder ViewHolder,字符串消息){
holder=新的WeakReference(视图持有者);
this.message=消息;
}
@凌驾
受保护的字符串doInBackground(字符串…str){
//在这里做你所有的背景资料
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
if(holder.get()!=null){
holder.get().messageTextView.setText(消息);
}
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onProgressUpdate(void…值){
}
}
您可以使用weakreference来确保,如果异步任务在应用程序被终止时仍处于活动状态,则异步任务不会阻止垃圾收集
我还注意到这个异步任务被称为长操作。您不希望在异步任务中执行长操作。异步任务按设计应该用于短操作。此外,如果onBindViewHolder()被大量调用(通常情况下,任何大小合适的recyclerview都会被调用),那么您将创建大量异步任务,这对性能非常不利。重新考虑一下你在做什么,几乎总有更好的方法
您最好创建一个处理程序和一个专门用于此目的的处理程序线程(并执行post) 好的,谢谢!但是我如何在里面声明我的“holder.messageTextView”呢?正如Steven前面的示例一样,您可以看到如何做到这一点(将holder作为参数传递)。但是我更喜欢使用set()
和get()
方法,在某处使用void setResult(String result){}
和String getResult(){return result;}
这样你就可以将数据设置到你的textview
像messageTextView.setText(getResult())代码>好的,谢谢!但是我如何在里面声明我的“holder.messageTextView”呢?正如Steven前面的示例一样,您可以看到如何做到这一点(将holder作为参数传递)。但是我更喜欢使用set()
和get()
方法,在某处使用void setResult(String result){}
和String getResult(){return result;}
这样您就可以将数据设置到