简体   繁体   English

Android:无法多次加载位图图像

[英]Android: Can't load bitmap image more than one time

I'm reading lots of post about bitmap on android and couldn't find any explanation that fits with my code. 我在android上阅读了大量有关位图的文章,找不到适合我代码的任何解释。 I'm saving image from camera inside sdcard, than when i try to show all image i get the error bellow. 我从sdcard内的相机保存图像,而不是当我尝试显示所有图像时出现以下错误。

06-09 20:38:03.732: E/AndroidRuntime(3657): java.lang.OutOfMemoryError
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:389)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at br.com.rigolas.financial.activity.InsertItem.getBitmap(InsertItem.java:415)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at br.com.rigolas.financial.activity.InsertItem.showAttachment(InsertItem.java:194)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at br.com.rigolas.financial.activity.InsertItem.populateFields(InsertItem.java:184)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at br.com.rigolas.financial.activity.InsertItem.onResume(InsertItem.java:144)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1188)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.app.Activity.performResume(Activity.java:5280)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2606)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2644)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2130)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.app.ActivityThread.access$600(ActivityThread.java:140)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.os.Looper.loop(Looper.java:137)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at android.app.ActivityThread.main(ActivityThread.java:4898)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at java.lang.reflect.Method.invokeNative(Native Method)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at java.lang.reflect.Method.invoke(Method.java:511)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
06-09 20:38:03.732: E/AndroidRuntime(3657):     at dalvik.system.NativeStart.main(Native Method)

My code: 我的代码:

showAttachment(atts);

where atts is an Array os paths 其中atts是数组os路径

private void showAttachment(List<Attachment> atts) {

    for(Attachment att : atts){
        insertPhoto(getBitmap(att.getPath()));
    }

}

public Bitmap getBitmap(String path){

    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeFile(path, bmOptions);

    return bitmap;

}

public void insertPhoto(Bitmap btmp){
    final ViewGroup newView = (ViewGroup) LayoutInflater.from(this).inflate(
            R.layout.photo_item, mContainerView, false);


    newView.setBackground(new BitmapDrawable(getResources(),btmp));
    ImageView delete = (ImageView) newView.findViewById(R.id.photo_expense_discart);
    delete.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //mContainerView.removeView(newView);
            Intent imageDetil = new Intent(InsertItem.this,ImageDetailActivity.class);
            InsertItem.this.startActivity(imageDetil);
        }
    });

    mContainerView.addView(newView, 0);
}

And my XML: 而我的XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="130dp"
android:layout_height="130dp"
android:layout_margin="5dp"
android:orientation="vertical" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:alpha="80"
    android:background="#80000000"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/photo_expense_discart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_content_discard_w" />
</LinearLayout>

if I do that with one image works fine, but when I try to show more than one, i get the error, does anyone know how can I solve that?thanks 如果我用一张图像可以做到这一点很好,但是当我尝试显示一张以上图像时,我得到了错误,有人知道我该怎么解决吗?

Check at this piece of the code you provided: 检查您提供的这段代码:

public Bitmap getBitmap(String path){

    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeFile(path, bmOptions);

    return bitmap;

}

In the line Bitmap bitmap = BitmapFactory.decodeFile(path, bmOptions); 在位Bitmap bitmap = BitmapFactory.decodeFile(path, bmOptions);行中, Bitmap bitmap = BitmapFactory.decodeFile(path, bmOptions); , you are probably tryng to decode a file too big, resulting in an outofmemory exception. ,您可能会尝试将文件解码太大,从而导致内存不足异常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM