Android RecyclerView和内存不足

Android RecyclerView和内存不足,android,out-of-memory,android-recyclerview,android-drawable,Android,Out Of Memory,Android Recyclerview,Android Drawable,我正在使用RecyclerView显示一些消耗资源的图像。我的实现如下所示: private class NoteConfigItemAdapter extends RecyclerView.Adapter<NoteConfigItemAdapter.NoteConfigViewHolder> { public class NoteConfigViewHolder extends RecyclerView.ViewHolder { private fina

我正在使用RecyclerView显示一些消耗资源的图像。我的实现如下所示:

private class NoteConfigItemAdapter extends RecyclerView.Adapter<NoteConfigItemAdapter.NoteConfigViewHolder> {

    public class NoteConfigViewHolder extends RecyclerView.ViewHolder {

        private final ToggleButton tbButton;
        private final TextView tvDescription;
        private int index;

        private final View.OnClickListener buttonClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int oldSelectedItem = selectedItem;
                selectedItem = index;
                notifyItemChanged(oldSelectedItem);
                notifyItemChanged(selectedItem);
            }
        };

        public NoteConfigViewHolder(View itemView) {
            super(itemView);

            tbButton = (ToggleButton)itemView.findViewById(R.id.notesConfig_tbButton);
            tvDescription = (TextView)itemView.findViewById(R.id.notesConfig_tvDescription);

            tbButton.setOnClickListener(this.buttonClickListener);
        }

        public void setData(int descriptionResource, int drawableResource, int index) {

            this.index = index;
            tvDescription.setText(descriptionResource);
            Drawable background = ResourcesCompat.getDrawable(getResources(), drawableResource, null);
            tbButton.setBackground(background);
            tbButton.setChecked(index == selectedItem);
        }
    }

    private List<NoteConfigItem> configItems;
    private int layoutResource;
    private int selectedItem = 0;

    public NoteConfigItemAdapter(List<NoteConfigItem> configItems, int layoutResource) {

        this.configItems = configItems;
        this.layoutResource = layoutResource;
    }

    @Override
    public NoteConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View itemView = LayoutInflater
                .from(parent.getContext())
                .inflate(layoutResource, parent, false);

        return new NoteConfigViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(NoteConfigViewHolder holder, int position) {

        NoteConfigItem item = configItems.get(position);
        holder.setData(item.stringResource, item.drawableResource, position);
    }

    @Override
    public int getItemCount() {

        return configItems.size();
    }
}
@drawable/fullRange
是PNG图像。它本身并没有那么大(大约有几百个这样的图像占据了400kb),但它相当大(225px x 450px),所以我猜从这个PNG创建的位图对象可能会占用大量内存

当我运行应用程序时,我监视内存使用情况。当我仅滚动浏览RecyclerViews时,图表如下所示:

private class NoteConfigItemAdapter extends RecyclerView.Adapter<NoteConfigItemAdapter.NoteConfigViewHolder> {

    public class NoteConfigViewHolder extends RecyclerView.ViewHolder {

        private final ToggleButton tbButton;
        private final TextView tvDescription;
        private int index;

        private final View.OnClickListener buttonClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int oldSelectedItem = selectedItem;
                selectedItem = index;
                notifyItemChanged(oldSelectedItem);
                notifyItemChanged(selectedItem);
            }
        };

        public NoteConfigViewHolder(View itemView) {
            super(itemView);

            tbButton = (ToggleButton)itemView.findViewById(R.id.notesConfig_tbButton);
            tvDescription = (TextView)itemView.findViewById(R.id.notesConfig_tvDescription);

            tbButton.setOnClickListener(this.buttonClickListener);
        }

        public void setData(int descriptionResource, int drawableResource, int index) {

            this.index = index;
            tvDescription.setText(descriptionResource);
            Drawable background = ResourcesCompat.getDrawable(getResources(), drawableResource, null);
            tbButton.setBackground(background);
            tbButton.setChecked(index == selectedItem);
        }
    }

    private List<NoteConfigItem> configItems;
    private int layoutResource;
    private int selectedItem = 0;

    public NoteConfigItemAdapter(List<NoteConfigItem> configItems, int layoutResource) {

        this.configItems = configItems;
        this.layoutResource = layoutResource;
    }

    @Override
    public NoteConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View itemView = LayoutInflater
                .from(parent.getContext())
                .inflate(layoutResource, parent, false);

        return new NoteConfigViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(NoteConfigViewHolder holder, int position) {

        NoteConfigItem item = configItems.get(position);
        holder.setData(item.stringResource, item.drawableResource, position);
    }

    @Override
    public int getItemCount() {

        return configItems.size();
    }
}

但当我开始选择项目时,占用的内存开始增长,直到OutOfMemoryException:


我做错了什么?为什么不重用/处置资源?

使用位图时,请确保在丢失其引用之前对其进行回收。位图通常是OutOfMemoryError的原因我在XML文件中定义的
可绘制
中使用
可绘制
。我怎样才能回收它们?愚蠢的问题,但我不得不问,你确定你没有用太多的内存吗?使用位图时,您发布的图像中的基线有点高。请确保在丢失其引用之前对其进行回收。位图通常是OutOfMemoryError的原因我在XML文件中定义的
可绘制
中使用
可绘制
。我怎样才能回收它们?愚蠢的问题,但我不得不问,你确定你没有用太多的内存吗?你发布的图片中的基线有点高