正在使用" new"在recyclerview onBind方法中一个不好的做法?

时间:2016-05-26 10:12:09

标签: java android android-recyclerview

我注意到当我一次又一次地在recyclerview上下移动时会分配更多的内存,移动多次内存消耗可以达到100MB,我的想法可能是我创建了太多的对象。

我必须显示项目的日期,因此在onBindViewHolder中我调用此函数

 public void displayDate(MessageViewHolder holder, int position){
        DateTime currentDate = new DateTime(getMessage(position).getSentDate());
        DateTimeFormatter builder = DateTimeFormat.forPattern("hh:mm a");
        String currentDateString = builder.print(currentDate);

        holder.date.setText(currentDateString);
        holder.date.setVisibility(View.VISIBLE);

        /*
          Display date only if the next message is not mine, or its date
          is different to the current message by 1 min
        */
        if(position+1<messages.size() && (getMessage(position+1).isMine() == getMessage(position).isMine())){
            DateTime nextDate = new DateTime(getMessage(position+1).getSentDate());
            if(builder.print(nextDate).equals(currentDateString)) {
                holder.date.setVisibility(View.GONE);
            }
        }
 }

从代码判断,我认为每次向上或向下滚动时,因为从onBindViewHolder调用此方法,所以自从我使用&#34; new&#34;以来始终创建日期对象,从而导致每次我再次向上和向下滚动时,内存分配都会增加。

致电&#34; new&#34;是不好的做法。在onBindViewHolder? 或者我是否在优化过程中并且应该让GC完成它的工作?

1 个答案:

答案 0 :(得分:0)

在ViewHolder绑定方法中分配许多对象对于性能来说不是一个好的实践。如果做了太多工作,RecyclerView行为会变慢并且滚动变得不是线性的。在您的示例中,我认为不会有太昂贵的工作,但您可以优化数据模型项中的代码保存时间戳。然后,如果item.date == null创建对象并保存到模型,否则从模型中检索数据值。

要检查新实例是否导致内存泄漏,请在滚动时注释代码并观察内存消耗。