我注意到当我一次又一次地在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完成它的工作?
答案 0 :(得分:0)
在ViewHolder绑定方法中分配许多对象对于性能来说不是一个好的实践。如果做了太多工作,RecyclerView行为会变慢并且滚动变得不是线性的。在您的示例中,我认为不会有太昂贵的工作,但您可以优化数据模型项中的代码保存时间戳。然后,如果item.date == null创建对象并保存到模型,否则从模型中检索数据值。
要检查新实例是否导致内存泄漏,请在滚动时注释代码并观察内存消耗。