java - asyncTask 内 viewholder 的 setText

标签 java android android-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,谢谢!

最佳答案

我不建议这样放置 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/

相关文章:

java - 当 AsyncTask 的 doInBackground 内部时列表读为空

java - Android AsyncTask/doInBackground 模式

android - AsyncTask 真的在概念上存在缺陷还是我只是遗漏了什么?

Java Maven WebApp Tomcat

java - 以最快和最简单的方式缩放 BufferedImage

android - 如何在 xml 中重新创建此背景?

android - 像在 spotify 应用程序中一样搜索幻灯片动画

java - Spring MVC : Implementing Cometd channel functionality

java - 使用 Spring Controller 和 jQuery AJAX 进行重定向

android - 使用 VCF 文件删除旧号码