asyncTask 中 viewholder 的 setText

setText for viewholder inside asyncTask

基本上我想使用异步任务为一个文本视图设置文本,但我不知道该怎么做这就是我到目前为止所做的

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 设置文本,谢谢!

只是 setTextonPostExecute 块内,结果 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 的情况),你将创建很多异步任务,这对性能非常不利。重新考虑你在做什么,几乎总是有更好的方法。

您最好专门为此目的创建一个处理程序和一个处理程序线程(并执行 post)。