【发布时间】:2019-01-20 21:30:27
【问题描述】:
更新
我发现了我的问题。我正在尝试使用 RecyclerView 处理大量图像(.webp 格式的 770 个图像,图像总大小为 10mb),它显示内存不足错误。
如何解决这个问题?
我正在使用毕加索来加载图像
抛出 OutOfMemoryError “无法分配 810076 字节分配,其中 107504 空闲字节和 104KB 直到 OOM”
旧
如果列表大小小于 100 没有问题,如何使用回收站视图加载 700 项。每个项目都包含 webp 共振峰的图像
我正在尝试这段代码,它抛出内存不足错误并使应用程序崩溃。如何解决这个错误?
(它包含 700 张图片,全部采用 webp 格式,并且此代码在 recyclerview 中,带有网格布局)
InputStream ins = null;
try {
ins = mContext.getAssets().open(mData.get(position).getImagename()+".webp");
Bitmap bitmap = BitmapFactory.decodeStream(ins);
holder.image.setImageBitmap(bitmap);
} catch (final IOException e) {
e.printStackTrace();
} finally {
if (ins != null)
try {
ins.close();
} catch (IOException e) { }
}
java.lang.OutOfMemoryError 在 android.graphics.BitmapFactory.nativeDecodeAsset(本机方法) 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:805) 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:845) 在tropicalfishhandbook.midhilaj.com.v2.a.a.a(未知来源) 在tropicalfishhandbook.midhilaj.com.v2.a.a.onBindViewHolder(未知 资源) 在 android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(未知 资源) 在 android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(未知 资源) 在 android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(未知 资源) 在 android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(未知 资源) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(未知 资源) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(未知 资源) 在 android.support.v7.widget.LinearLayoutManager$LayoutState.next(未知 资源) 在 android.support.v7.widget.GridLayoutManager.layoutChunk(未知 资源) 在 android.support.v7.widget.LinearLayoutManager.fill(未知来源) 在 android.support.v7.widget.LinearLayoutManager.onLayoutChildren(未知 资源) 在 android.support.v7.widget.GridLayoutManager.onLayoutChildren(未知 资源) 在 android.support.v7.widget.RecyclerView.dispatchLayoutStep2(未知 资源) 在 android.support.v7.widget.RecyclerView.onMeasure(未知来源) 在 android.view.View.measure(View.java:16749) 在 android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 在 android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 在 android.view.View.measure(View.java:16749) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5295) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1413) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:696) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:589) 在 android.view.View.measure(View.java:16749) 在 android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1235) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 在 android.widget.ScrollView.onMeasure(ScrollView.java:327) 在 android.view.View.measure(View.java:16749) 在 android.support.constraint.ConstraintLayout.a(未知来源) 在 android.support.constraint.ConstraintLayout.onMeasure(未知来源) 在 android.view.View.measure(View.java:16749) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5295) 在 android.support.design.widget.CoordinatorLayout.a(未知来源) 在 android.support.design.widget.h.a(未知来源) 在 android.support.design.widget.AppBarLayout$ScrollingViewBehavior.a(未知 资源) 在 android.support.design.widget.CoordinatorLayout.onMeasure(未知 资源) 在 android.view.View.measure(View.java:16749) 在 android.support.v4.widget.DrawerLayout.onMeasure(未知来源) 在 android.view.View.measure(View.java:16749) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5295) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 在 android.support.v7.widget.ContentFrameLayout.onMeasure(未知来源) 在 android.view.View.measure(View.java:16749) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5295) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1413) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:696) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:589) 在 android.view.View.measure(View.java:16749) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5295) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 在 android.view.View.measure(View.java:16749) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5295) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1413) 在 android.widget.LinearLayout.measureVertical(Lin
我的清单文件
<application
android:name=".App"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
tools:replace="android:allowBackup"
android:theme="@style/AppTheme">
更新
我换成了 Picasso,它在 2gb ram 的智能手机中工作,它在 500mb 的智能手机中崩溃,有时它也在 1gb ram 智能手机中崩溃
添加毕加索后,现在图像需要 5 秒才能加载
更新的新代码 但问题没有解决
这是我用来加载的代码
try {
List<Millafish_profile> list = mDatabaseManager.getAll();
for (int i = 0; i < list.size(); i++) {
final int finalI = i;//"@drawable/" +
String uri = list.get(i).getPic().replace("’", "_").replace(".jpg", "").replace(".png", "").replace("-", "_"); // where myresource (without the extension) is the file
// Log.i("uri_"+i,uri+"");
Millafish_profile millafish_profile = list.get(i);//mDatabaseManager.getprofile(mDatabaseManager.getallfishname().get(finalI));
millafish_profile.setImageuri(uri.toLowerCase());
millafish_profileList.add(millafish_profile);
//if(i==20)break;
{
//adapter.notifyItemChanged(i);
//(millafish_profileList.size());
}
}
adapter.notifyDataSetChanged();
millafish_profileList_org = new ArrayList<>();
millafish_profileList_org.addAll(millafish_profileList);
}catch (Exception e){
Log.e("homepage",e.getMessage()+"");
}
【问题讨论】:
-
你试过压缩位图吗
-
不,我不尝试压缩
-
代码与问题共享
-
所以尝试压缩看我的回答
-
肯定会崩溃,并且由于图像太多会出现内存问题。最好使用 ListView 或者 RecyclerView 来一张一张的加载图片。通过使用这个,只有渲染的图像会加载到内存中,而不是一次加载所有的图像。
标签: java android android-recyclerview android-drawable picasso