基本上我正在制作一个可滚动的图像Feed。并且它很有效。但是当内存分析时,我不认为我的用户可以加载大量图像而不会崩溃。我还在为Instagram的应用程序进行内存分析,并发现虽然他们正在加载大量的图像,但无论我的屏幕上有多少图像,它们的堆大小都保持不变。可能有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;
}
}
答案 0 :(得分:0)
使用Facebook Fresco。它使用ashmem来存储图像。
您也可以尝试重复使用位图。阅读official docs以获取有关有效位图加载的更多信息。
还可以考虑使用Glide或Picasso库而不是手动图像加载。
答案 1 :(得分:0)
我只是过度思考它,结果是回收者的观点才刚刚完成这项工作