Thanks, Romain. I'm grabbing them from a server, but you're right, if
anything, I should convert and re-save them in a smaller format before
caching them locally. Well, I just tried to get it running quickly :)

One laaast thing - You mentioned that an app has a 16MB heap. How is
that split up? A Runtime.getRuntime().freeMemory() right on startup in
the app above gives me about 800KB or so (although the app is later
able to allocate 1MB to decode an image). I'm not very familiar with
Dalvik's memory management, how is the whole thing set up?

-Mike


On Dec 3, 11:26 pm, Romain Guy <[EMAIL PROTECTED]> wrote:
> Well you could start by not loading such huge images in a Gallery.
> Even if the recycler was working correctly it is a LOT of data to read
> and to decode. It's also a lot of wasted memory (and it also slows
> drawing down since the bitmaps are drawn rescaled.) You should use
> BitmapFactory.Options or Bitmap.createScaledBitmap to load your image
> pre-scaled to a much more reasonable size.
>
>
>
> On Wed, Dec 3, 2008 at 11:23 PM, EboMike <[EMAIL PROTECTED]> wrote:
>
> > Thanks a lot for the very quick replies. One last thing: Do you happen
> > to have any remote idea about when the next SDK release is scheduled?
> > My app is currently running out of memory a lot :)
>
> > On Dec 3, 11:13 pm, Romain Guy <[EMAIL PROTECTED]> wrote:
> >> A memory leak is actually totally expected in that case. Gallery, like
> >> ListView, GridView, etc. uses a recycling heap. Every time a view is
> >> unused, it is moved to the recycler. Unfortunately, if it's never
> >> taken out of the recycler...
>
> >> On Wed, Dec 3, 2008 at 11:07 PM, EboMike <[EMAIL PROTECTED]> wrote:
>
> >> > Thanks a lot, Romain! Question though - even if the gallery is not
> >> > converting the views, why doesn't it release references to them as you
> >> > move away?
>
> >> > Say, I move from view 0 to view 1, with view 0 being completely off-
> >> > screen, the gallery should remove its reference to view 0 since it is
> >> > no longer needed, and thus allow the gc to free up any memory it
> >> > holds. In fact, when I go back to view 0, I can see that a new view is
> >> > created. So what happened to the old view 0? Even with view conversion
> >> > not working, there shouldn't be memory leaks.
>
> >> > -Mike
>
> >> > On Dec 3, 11:04 pm, Romain Guy <[EMAIL PROTECTED]> wrote:
> >> >> I just checked and the bug is simply that Gallery does not convert the
> >> >> views. I'll try to fix it as soon as possible.
>
> >> >> On Wed, Dec 3, 2008 at 10:45 PM, EboMike <[EMAIL PROTECTED]> wrote:
>
> >> >> > I've already asked this in <a href="http://groups.google.com/group/
> >> >> > android-developers/msg/9cdbf47be2505810?hl=en">This thread</a>: Here
> >> >> > is a pretty simple Gallery setup. It seems to leak with every image
> >> >> > that's loaded (see the original thread for details).
>
> >> >> > I'm tempted to file it as a bug, but I want to mention it here first
> >> >> > to make sure I'm not just making a simple mistake in my usage of the
> >> >> > Gallery. Also (as mentioned in another thread), convertView is always
> >> >> > null -- the Gallery never seems to recycle any views. Why?
>
> >> >> > To make this run, you will need to put a JPG file into the data folder
> >> >> > (see code).
>
> >> >> > package ebomike.memorytest;
>
> >> >> > import android.app.Activity;
> >> >> > import android.content.Context;
> >> >> > import android.graphics.Bitmap;
> >> >> > import android.graphics.BitmapFactory;
> >> >> > import android.graphics.drawable.BitmapDrawable;
> >> >> > import android.os.Bundle;
> >> >> > import android.util.Log;
> >> >> > import android.view.View;
> >> >> > import android.view.ViewGroup;
> >> >> > import android.widget.BaseAdapter;
> >> >> > import android.widget.Gallery;
> >> >> > import android.widget.ImageView;
>
> >> >> > public class MemoryTest extends Activity {
>
> >> >> >        Gallery g;
>
> >> >> >    /** Called when the activity is first created. */
> >> >> >   [EMAIL PROTECTED]
> >> >> >    public void onCreate(Bundle savedInstanceState) {
>
> >> >> >                String filePath;
>
> >> >> >                // NOTE: Make this point to a JPEG file.
> >> >> >                filePath = getFilesDir().getPath();
> >> >> >                filePath += "/TEST_IMAGE.jpg";
>
> >> >> >        super.onCreate(savedInstanceState);
> >> >> >        setContentView(R.layout.main);
>
> >> >> >        g = (Gallery) findViewById(R.id.Gallery01);
> >> >> >        g.setAdapter(new FullImageAdapter(this, filePath));
> >> >> >    }
>
> >> >> >    class FullImageAdapter extends BaseAdapter
> >> >> >    {
> >> >> >        Context context;
> >> >> >        String path;
>
> >> >> >        FullImageAdapter(Context c, String path)
> >> >> >        {
> >> >> >                context = c;
> >> >> >                this.path = path;
> >> >> >        }
>
> >> >> >        public int getCount()
> >> >> >        {
> >> >> >                return 1024;
> >> >> >        }
>
> >> >> >        public int getViewTypeCount()
> >> >> >        {
> >> >> >                return 1;
> >> >> >        }
>
> >> >> >        public boolean hasStableIds()
> >> >> >        {
> >> >> >                return true;
> >> >> >        }
>
> >> >> >        public int getItemViewType(int position)
> >> >> >        {
> >> >> >                return 0;
> >> >> >        }
>
> >> >> >        public View getView(int position, View convertView, ViewGroup
> >> >> > parent)
> >> >> >        {
> >> >> >                ImageView view;
>
> >> >> >                if (convertView != null)
> >> >> >                {
> >> >> >                        // Note that we never get here. Why?
> >> >> >                        view = (ImageView) convertView;
> >> >> >                }
> >> >> >                else
> >> >> >                {
> >> >> >                        view = new ImageView(context);
> >> >> >                }
>
> >> >> >                Bitmap bitmap = BitmapFactory.decodeFile(path);
> >> >> >                BitmapDrawable drawable = new BitmapDrawable(bitmap);
> >> >> >                view.setImageDrawable(drawable);
>
> >> >> >                return view;
> >> >> >        }
>
> >> >> >        public Object getItem(int position)
> >> >> >        {
> >> >> >                return position;
> >> >> >        }
>
> >> >> >        public long getItemId(int position)
> >> >> >        {
> >> >> >                return position;
> >> >> >        }
> >> >> >    }
> >> >> > }
>
> >> >> > The layout:
>
> >> >> > <?xml version="1.0" encoding="utf-8"?>
> >> >> > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/
> >> >> > android"
> >> >> >    android:orientation="vertical"
> >> >> >    android:layout_width="fill_parent"
> >> >> > android:layout_height="fill_parent">
> >> >> > <TextView
> >> >> >    android:layout_width="fill_parent"
> >> >> >    android:layout_height="wrap_content"
> >> >> >    android:text="@string/hello"
> >> >> >    />
> >> >> > <Gallery android:id="@+id/Gallery01"
> >> >> > android:layout_width="fill_parent"
> >> >> > android:layout_height="fill_parent"></Gallery>
>
> >> >> > </LinearLayout>
>
> >> >> --
> >> >> Romain Guywww.curious-creature.org
>
> >> --
> >> Romain Guywww.curious-creature.org
>
> --
> Romain Guywww.curious-creature.org
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to