Android loading images efficient (out of memory) [duplicate]

99封情书 提交于 2019-12-02 20:08:20

问题


I just startet writing an app for Android. I have 3 activitys that use the same xml layout, an grid view. They also use all the same adapter to show an imageview and an textview in each grid item. When you select an object in the first activity, you get to the second and then to the third.

First I used the normal method "imageView.setImageResource(drawableid)". It wasn't really a problem, but when I put more images into the gridview, I got the outofmemory error.

So I search for a solution. I tried the thing from the android dev site with decode bitmap, resize and Async task and so on. The other thing was the picasso library, wich would be very simple with "Picasso.with(mContext).load(imageURI).into(imageView);". But picasso ist to slow for the gridview. It looks messed up while scrolling. And sometimes some images weren't load.

All metodes fill the memory and the app crashes when I open the activities a couple times. What am I doing wrong? Can I free up the memory by myself, when I leave the first activity to the second?


回答1:


Best solution is use the RecyclerView in your app https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html




回答2:


There was an answer in SO about freeing up memory manually. I couldn't find it now so I am pasting the answer I am implementing

Define the following function

    //To free up memory taken by adapterViews and others
private void unbindDrawables(View view) {
    if (view.getBackground() != null)
        view.getBackground().setCallback(null);

    if (view instanceof ImageView) {
        ImageView imageView = (ImageView) view;
        imageView.setImageBitmap(null);
    } else if (view instanceof ViewGroup) {
        ViewGroup viewGroup = (ViewGroup) view;
        for (int i = 0; i < viewGroup.getChildCount(); i++)
            unbindDrawables(viewGroup.getChildAt(i));

        if (!(view instanceof AdapterView))
            viewGroup.removeAllViews();
    }
}

then in your onDestroy method use

unbindDrawables(findViewById(R.id.view_to_unbind));
System.gc();

This has stopped my app from crashing on orientation change.




回答3:


You load image thumbnail in grid view not the main image after clicking on gridview you make a request to load the main image. Store thumbnails on server also.



来源:https://stackoverflow.com/questions/31260112/android-loading-images-efficient-out-of-memory

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!