【问题标题】:setText for viewholder inside asyncTaskasyncTask 中视图的 setText
【发布时间】:2019-07-29 17:02:55
【问题描述】:

基本上我想使用 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,谢谢!

【问题讨论】:

  • onBindViewHolder 中运行 AsyncTask 真的很糟糕。请重新考虑您的架构。想象一下:如果用户上下滚动 300 次会怎样。这将创建近 1000 个 AsyncTask。
  • 在将列表设置为适配器之前对整个列表执行长时间运行的操作

标签: java android android-asynctask


【解决方案1】:

我不建议这样放置 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 的情况),你将创建很多异步任务,这对性能非常不利。重新考虑你在做什么,几乎总是有更好的方法来做到这一点。

您最好为此专门创建一个处理程序和一个处理程序线程(并进行发布)。

【讨论】:

  • 啊,我明白了,所以您建议我使用处理程序?我只需要放那个 setText 和一些 firebase 代码
  • 好吧,我不知道您的代码是如何构建的以及您要实现的目标。如果您对此提出单独的问题,我将很乐意回答。
【解决方案2】:

只是setTextonPostExecute 块内,结果string 就像messageTextView.setText(result);。希望它会奏效。 如果你找不到view 绑定使用presenter/callbacks/interface

【讨论】:

  • 好的,谢谢!但是我怎样才能在里面声明我的“holder.messageTextView”?
  • 正如 Steven 之前的示例,您可以看到如何做到这一点(将 holder 作为参数传递)。但我更喜欢使用set()get() 方法,void setResult(String result) {} 在某处和String getResult() { return result; } 然后您将能够将数据设置为您的textview,如messageTextView.setText(getResult());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多