Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java asyncTask中viewholder的setText_Java_Android_Android Asynctask - Fatal编程技术网

Java asyncTask中viewholder的setText

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

基本上,我想使用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) {
        }
    }
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
like
messageTextView.setText(结果)。希望它能起作用。

如果找不到要绑定的
视图
,请使用presenter/callbacks/interface

仅在
onPostExecute
块中的
setText
,使用结果
字符串
like
messageTextView.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;}
这样您就可以将数据设置到