在 android 中不使用 java 堆就在社交应用程序中加载大量位图?
Loading lots of bitmaps in an social app without using java heap in android?
基本上我正在制作一个可滚动的图像提要。它 works.But 在内存分析时我认为我的用户将无法在没有 crashing.I 的情况下加载大量图像也在为 Instagram 的应用程序进行内存分析并发现他们正在加载大量图像但是无论我在 screen.There 上有多少图像,它们的堆大小都保持不变 可能有 3 种可能性
1) 他们要么使用本机内存进行图像渲染,但我已经尝试实现它,但我无法在不使用堆的情况下渲染图像(如果你能在这方面帮助我,那就太棒了)
2) 他们使用的 inSampleSize 大于 4,但这实际上是不可能的,因为图像清晰且质量中等
3)我闻到了原生 openGL 界面的味道,是吗?
我是不是漏掉了什么!!请帮忙 !!
我正在使用 "ImageView" 加载位图
即使在内存分析时 "Vine app" 我发现他们的 java 堆也保持不变,而我的 java 堆随着加载的位图数量增加
我现在正在使用这个库
https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations
@Override
protected String doInBackground(String[] Params) {
ParseFile fileObject = (ParseFile)photoObject.get("image");
try {
dataMain = fileObject.getData() ;
if(dataMain!= null) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inSampleSize = 1;
options.inSampleSize = calculateInSampleSize(options, context.getResources().getDisplayMetrics().widthPixels,
context.getResources().getDisplayMetrics().widthPixels );
options.inJustDecodeBounds = false;
options.inPurgeable = true;
bitmapHolder = new JniBitmapHolder(BitmapFactory.decodeByteArray(dataMain, 0, dataMain.length, options));
bitmapHolder.scaleBitmap(widthPixels ,widthPixels* bitmapHolder.getBitmap().getHeight() / bitmapHolder.getBitmap().getWidth(), JniBitmapHolder.ScaleMethod.NearestNeighbour);
//bmp = null ;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
return "done";
}
@Override
protected void onPostExecute(String bitmap) {
ImageView imageView = imageViewReference.get();
if(imageView!= null && bitmapHolder.getBitmap() != null) {
imageView.setImageBitmap(bitmapHolder.getBitmapAndFree());
bitmapHolder = null;
}
}
使用 Facebook Fresco。它使用 ashmem 来存储图像。
您也可以尝试重新使用位图。阅读 official docs 以了解有关高效位图加载的更多信息。
还可以考虑使用 Glide 或 Picasso 库而不是手动加载图像。
我只是想多了,结果是回收站视图正好完成了工作
基本上我正在制作一个可滚动的图像提要。它 works.But 在内存分析时我认为我的用户将无法在没有 crashing.I 的情况下加载大量图像也在为 Instagram 的应用程序进行内存分析并发现他们正在加载大量图像但是无论我在 screen.There 上有多少图像,它们的堆大小都保持不变 可能有 3 种可能性
1) 他们要么使用本机内存进行图像渲染,但我已经尝试实现它,但我无法在不使用堆的情况下渲染图像(如果你能在这方面帮助我,那就太棒了)
2) 他们使用的 inSampleSize 大于 4,但这实际上是不可能的,因为图像清晰且质量中等
3)我闻到了原生 openGL 界面的味道,是吗?
我是不是漏掉了什么!!请帮忙 !! 我正在使用 "ImageView" 加载位图
即使在内存分析时 "Vine app" 我发现他们的 java 堆也保持不变,而我的 java 堆随着加载的位图数量增加
我现在正在使用这个库 https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations
@Override
protected String doInBackground(String[] Params) {
ParseFile fileObject = (ParseFile)photoObject.get("image");
try {
dataMain = fileObject.getData() ;
if(dataMain!= null) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inSampleSize = 1;
options.inSampleSize = calculateInSampleSize(options, context.getResources().getDisplayMetrics().widthPixels,
context.getResources().getDisplayMetrics().widthPixels );
options.inJustDecodeBounds = false;
options.inPurgeable = true;
bitmapHolder = new JniBitmapHolder(BitmapFactory.decodeByteArray(dataMain, 0, dataMain.length, options));
bitmapHolder.scaleBitmap(widthPixels ,widthPixels* bitmapHolder.getBitmap().getHeight() / bitmapHolder.getBitmap().getWidth(), JniBitmapHolder.ScaleMethod.NearestNeighbour);
//bmp = null ;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
return "done";
}
@Override
protected void onPostExecute(String bitmap) {
ImageView imageView = imageViewReference.get();
if(imageView!= null && bitmapHolder.getBitmap() != null) {
imageView.setImageBitmap(bitmapHolder.getBitmapAndFree());
bitmapHolder = null;
}
}
使用 Facebook Fresco。它使用 ashmem 来存储图像。
您也可以尝试重新使用位图。阅读 official docs 以了解有关高效位图加载的更多信息。
还可以考虑使用 Glide 或 Picasso 库而不是手动加载图像。
我只是想多了,结果是回收站视图正好完成了工作