使用gallery函数发生java.lang.OutofMemory异常

时间:2015-01-09 14:27:46

标签: android

我正在尝试创建一个包含大量图片的图库。

我只有一个活动会显示这个,除了画廊之外,当前画廊图片下面会有一个放大图。这是一张图片来展示我正在谈论的内容:

图片:[1] https://cdn.tutsplus.com/mobile/uploads/legacy/Android-SDK_GalleryView/gallery_complete.png

我遇到的问题是,当我运行应用程序时会发生java.lang.OutOfMemory异常,即使我非常确定我没有超过内存堆。

这是我的Java代码:

package com.exple.v1;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;




public class MainActivity extends ActionBarActivity {

    private Integer[] pics = {R.drawable.one,
            R.drawable.two,

            };
    private ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Gallery gallery = (Gallery)findViewById(R.id.gallery1);

        gallery.setAdapter(new ImageAdapter(this));
        imageView = (ImageView)findViewById(R.id.imageView1);


        gallery.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                Toast.makeText(getApplicationContext(), "pic: " + position, Toast.LENGTH_SHORT).show();

                imageView.setImageResource(pics[position]);
            }
        });
    }

    public class ImageAdapter extends BaseAdapter
    {
        private Context context;
        int imageBackground;

        public ImageAdapter(Context context)
        {

            this.context = context;
        }

        @Override
        public int getCount() {

            return pics.length;
        }

        @Override
        public Object getItem(int position) {

            return position;
        }

        @Override
        public long getItemId(int position) {

            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ImageView imageView = new ImageView(context);
            imageView.setImageResource(pics[position]);


            return imageView;
        }

    }


}

这是我的xml代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/drawable"
    android:padding="5dp"
    tools:context="com.exple.v1.MainActivity" >

    <LinearLayout
        android:id="@+id/linear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <Gallery
            android:id="@+id/gallery1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1.90" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="10dp" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="El che"
            android:src="@drawable/elche" />

    </LinearLayout>

</LinearLayout>

这是我的整个错误日志:

01-09 09:13:49.387: E/AndroidRuntime(2358): FATAL EXCEPTION: main
01-09 09:13:49.387: E/AndroidRuntime(2358): Process: com.exple.v1, PID: 2358
01-09 09:13:49.387: E/AndroidRuntime(2358): java.lang.OutOfMemoryError
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.content.res.Resources.loadDrawable(Resources.java:2110)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.content.res.Resources.getDrawable(Resources.java:700)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.ImageView.resolveUri(ImageView.java:638)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.ImageView.setImageResource(ImageView.java:367)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at com.exple.v1.MainActivity$ImageAdapter.getView(MainActivity.java:82)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.Gallery.makeAndAddView(Gallery.java:865)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.Gallery.fillToGalleryRightLtr(Gallery.java:819)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.Gallery.fillToGalleryRight(Gallery.java:763)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.Gallery.layout(Gallery.java:672)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.Gallery.onLayout(Gallery.java:357)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.View.layout(View.java:14817)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.View.layout(View.java:14817)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.View.layout(View.java:14817)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.View.layout(View.java:14817)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.View.layout(View.java:14817)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.View.layout(View.java:14817)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.Choreographer.doCallbacks(Choreographer.java:574)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.Choreographer.doFrame(Choreographer.java:544)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.os.Handler.handleCallback(Handler.java:733)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.os.Handler.dispatchMessage(Handler.java:95)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.os.Looper.loop(Looper.java:136)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at android.app.ActivityThread.main(ActivityThread.java:5017)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at java.lang.reflect.Method.invokeNative(Native Method)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at java.lang.reflect.Method.invoke(Method.java:515)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-09 09:13:49.387: E/AndroidRuntime(2358):     at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:0)

如果您在应用中的其他任何位置使用位图,则需要确保在不再使用时调用.recycle()。原因是即使java对象超出范围,本机对象仍留在内存中。

或者它可能与drawables的大小有关。 (出于好奇,它们的大小是多少?)