- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 recyclerview 列出大约 120 种布局,其中包括 1 个 Imagebutton、1 个 Textview 和 1 个 Button。当我第一次启动其中包含 recyclerview 的 Activity 时,初始内存使用量约为 50mb。但是当我滚动它时,它急剧增加并在我到达列表末尾时达到 130-150mb。我使用 GridLayoutManager 作为我的 LayoutManager,跨度数为 3。
我的图片很小(只有 200x200,所有 120 张图片的大小是 612 KB)
是什么导致内存使用量增加?我该如何解决这个问题。我收到了很多 OutOfMemory 崩溃报告,它们主要发生在 android 6 中。感谢您的宝贵时间。
*我尝试使用像 Picasso 这样的第三方库来代替设置后台资源。*我试过用位图工厂解码图像
在 Emotes Activity 中初始化我的 recyclerview:
recyclerView = findViewById(R.id.recyclerview);
adapter = new Adapter(arr, this);
adapter.setHasStableIds(true);
recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(20);
recyclerView.setAdapter(adapter);
我的适配器:
public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
private CommonMethods commonMethodsInterface;
private ArrayList<Emote> emoteArray ;
private ArrayList<Emote> emoteArrayFull;
public Adapter(ArrayList<Emote> emoteArray,CommonMethods commonMethodsInterface) {
this.emoteArray = new ArrayList<>(emoteArray);
this.emoteArrayFull = new ArrayList<>(emoteArray);
this.commonMethodsInterface = commonMethodsInterface;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_listitem,viewGroup,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int i) {
viewHolder.emoteButton.setBackgroundResource(emoteArray.get(i).getIconPath());
viewHolder.text.setText(emoteArray.get(i).getName().toUpperCase());
viewHolder.emoteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatabaseConstants.INTERSTITIAL_AD_COUNTER++;
commonMethodsInterface.ShowInterstitialAd();
commonMethodsInterface.playEmoteSound(emoteArray.get(i));
}
});
viewHolder.optionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatabaseConstants.INTERSTITIAL_AD_COUNTER++;
commonMethodsInterface.ShowInterstitialAd();
commonMethodsInterface.ShowDialog(emoteArray.get(i));
}
});
}
@Override
public int getItemCount() {
return emoteArray.size();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
ImageButton emoteButton;
Button optionButton;
TextView text;
public ViewHolder(@NonNull View itemView) {
super(itemView);
emoteButton = itemView.findViewById(R.id.tempimagebutton);
optionButton = itemView.findViewById(R.id.tempbutton);
text = itemView.findViewById(R.id.temptext);
}
}
}
Stacktrace
java.lang.OutOfMemoryError:
at dalvik.system.VMRuntime.newNonMovableArray (Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset (Native Method)
at android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:709)
at android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:530)
at android.graphics.drawable.Drawable.createFromResourceStream (Drawable.java:1089)
at android.content.res.Resources.loadDrawableForCookie (Resources.java:2963)
at android.content.res.Resources.loadDrawable (Resources.java:2848)
at android.content.res.HwResources.loadDrawable (HwResources.java:712)
at android.content.res.Resources.getDrawable (Resources.java:970)
at android.content.Context.getDrawable (Context.java:463)
at android.view.View.setBackgroundResource (View.java:17562)
at android.support.v7.widget.AppCompatImageButton.setBackgroundResource (AppCompatImageButton.java:114)
at com.nullbytesoftware.example.Adapter.onBindViewHolder (Adapter.java:42)
**at com.nullbytesoftware.example.Adapter.onBindViewHolder (Adapter.java:18)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder (RecyclerView.java:6781)**
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder (RecyclerView.java:6823)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline (RecyclerView.java:5752)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline (RecyclerView.java:6019)
at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline (GapWorker.java:286)
at android.support.v7.widget.GapWorker.flushTaskWithDeadline (GapWorker.java:343)
at android.support.v7.widget.GapWorker.flushTasksWithDeadline (GapWorker.java:359)
at android.support.v7.widget.GapWorker.prefetch (GapWorker.java:366)
at android.support.v7.widget.GapWorker.run (GapWorker.java:397)
at android.os.Handler.handleCallback (Handler.java:819)
at android.os.Handler.dispatchMessage (Handler.java:104)
at android.os.Looper.loop (Looper.java:210)
at android.app.ActivityThread.main (ActivityThread.java:5982)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:852)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:742)
最佳答案
我不知道这是不是一个奇怪的错误,或者我在实现 Recyclerview 但设置 viewHolder.setIsRecyclable(false) 时做错了什么;让我的 RecyclerView 开始回收元素并解决了我的内存问题。仍然很想知道这种相反行为背后的原因。
关于java - 在 recyclerview 中滚动时内存使用量增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56823590/
我希望有人能解释为什么我的应用程序在加载时使用不同数量的 RAM。我说的是直接使用 exe 的编译版本。这是一个非常基本的应用程序,在应用程序的启动中没有条件分支。然而,每次我启动它时,RAM 量都在
我有一个 inode 使用率为 100% 的磁盘驱动器(使用 df -i 命令)。但是在大量删除文件后,使用率仍然是 100%。 那么正确的做法是什么? 磁盘空间使用量较少的磁盘驱动器怎么可能有Ino
假设我与分支有一个智能合约,其中每个分支都有不同数量的操作。 if (someCondition) { // do operations costing 10 gas } else { //d
是否有一种工具可以在提交到 NEAR 网络之前估算合约调用将产生多少 gas? 最佳答案 目前最好的估计是用runtime-standalone ,它可以处理交易而不必担心共识/网络。这意味着您可以创
我正在使用最新的 SDK 开发适用于 Windows Azure 的应用程序。 目前我正在使用缓存实现 session 提供程序,但模拟器完全不成比例: 缓存被实现为“非常小的”辅助角色(最大 768
我正在为我的 Logstash RAM 问题寻找答案,因为它几乎是 100%。我为它做了很多搜索,但他们没有为我工作。下面的代码是我的 logstash.conf 文件。我认为它需要一些小改动。 Lo
我已经阅读了这里有关此问题的所有其他问题以及互联网其他地方的许多文章。根据this site ,最大内存使用量遵循以下公式: Max memory = [-Xmx] + [-XX:MaxPermSiz
我需要以编程方式增加 Android 中的 RAM 使用量,以观察它随时间的变化。我该怎么做? 我尝试生成很多自定义对象,但生成后意外地 RAM 使用量减少了...我更改了对象数量、结构等,但没有任何
我们使用带有 MMFiles 存储引擎的 ArangoDB 3.3.14(社区版)来处理相对较大的数据集(备份时会超过 30 GB)。我们使用 ECS 在 Docker 容器内运行它。我们的主机虚拟机
我收到了 Hostgator 发来的一条说明,表明他们限制了我对 MYSQL 的访问,因为我的网站使用了太多资源。 通常,在这种情况下,我只会恢复备份以查看最近的更改是否会产生错误。但是,除了写了一些
我使用 TMimeMess 来解码基于 SMTP 服务器的传入电子邮件在突触上。 我发现用于解码 50MB MIME 消息(带有附件),TMimeMess 使用了 600-800MB 的内存。 在这里
我正在打包适用于 iOS 和 Android 的 Adobe Air 应用程序,并且我的 (RAM) 内存使用量超过 100MB。我的游戏(RPG)中有大量 Assets 。 Assets 的数量
我是一名优秀的程序员,十分优秀!