我正在尝试创建一个包含大量图片的图库。
我只有一个活动会显示这个,除了画廊之外,当前画廊图片下面会有一个放大图。这是一张图片来展示我正在谈论的内容:
图片:[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)
答案 0 :(得分:0)
如果您在应用中的其他任何位置使用位图,则需要确保在不再使用时调用.recycle()。原因是即使java对象超出范围,本机对象仍留在内存中。
或者它可能与drawables的大小有关。 (出于好奇,它们的大小是多少?)