【问题标题】:Loading lots of bitmaps in an social app without using java heap in android?在社交应用程序中加载大量位图而不在 android 中使用 java 堆?
【发布时间】:2015-12-31 13:43:43
【问题描述】:

基本上,我正在制作可滚动的图像提要。它有效。但是当内存分析时,我认为我的用户无法加载大量图像而不会崩溃。我也在为 Instagram 的应用程序进行内存分析,发现虽然他们正在加载大量图像,但它们的堆大小仍然存在无论我的屏幕上有多少图像,都保持不变。可能有 3 种可能性

1)他们要么使用本机内存进行图像渲染,但我尝试过实现它,但如果不使用堆,我无法渲染图像(如果你能在这方面帮助我,那就太酷了)

2)他们使用大于 4 的 inSampleSize 但这实际上是不可能的,因为图像清晰且质量中等

3)我在这闻到了原生的openGL接口,是吗?

我错过了什么吗!请帮忙 !! 我正在使用“ImageView”来加载位图


即使在对“Vine 应用程序”进行内存分析时,我发现它们的 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;


            }

      }

【问题讨论】:

  • 尝试各种方法我将使用opengl的c实现,使用JNI,在屏幕上逐像素绘制图片

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


【解决方案1】:

我只是想多了,原来回收者的观点只是做了这个工作

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • (youtube.com/watch?v=JEdcPenx8p8) fresco 的内存分析看起来很可怕
    • @mohitgupta 然后使用 Glide 或 Picasso。它们足够简单和智能,可以处理大量图像。
    • 已经使用 glide 并且我也一直在重用位图,但没有显着的结果全部使用 java heap
    • 这很奇怪...如果您可以控制服务器端,请考虑生成较小的图像。我的同胞也做了一个关于构建速度极快的社交应用程序的非常好的演示。它是俄语的,但也许你会觉得它很有趣(PowerPoint 似乎可以翻译它)。 slideshare.net/mobile/ex3ndr/telegram-46277569
    • 也尽量使用LeakCanary等工具。看起来你有内存泄漏。
    猜你喜欢
    • 2011-07-04
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多