在社交应用中加载大量位图而不在android中使用java堆?

时间:2015-12-31 13:43:44

标签: android bitmap java-native-interface instagram vine

基本上我正在制作一个可滚动的图像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;


            }

      }

2 个答案:

答案 0 :(得分:0)

使用Facebook Fresco。它使用ashmem来存储图像。

您也可以尝试重复使用位图。阅读official docs以获取有关有效位图加载的更多信息。

还可以考虑使用Glide或Picasso库而不是手动图像加载。

答案 1 :(得分:0)

我只是过度思考它,结果是回收者的观点才刚刚完成这项工作