2011-09-30 89 views
0

我是,使用近90張非常大的圖片,我使用延遲加載在Gallery中顯示圖片,並在加載圖片後加載grid view.so,如果您點擊任何按鈕,它會發出內存(oom)錯誤,有時它給Xml二元膨脹異常。android.view.InflateException:二進制XML <Unknown>和OutOfMemoryError?

我使用非常大的圖像,等於平板電腦大小的圖像,我的apk大小爲25MB,.and我使用單個活動與多個FrameLayouts,但在加載新視圖之前,我正在刪除當前視圖,但仍然存在問題,我不知道它爲什麼會發生?它給出了oom錯誤,但沒有給出錯誤的確切位置,並且它給出了隨機位置錯誤和錯誤頻繁發生。

09-30 15:23:07.490: ERROR/AndroidRuntime(5527): FATAL EXCEPTION: main 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527): android.view.InflateException: Binary XML file line #13: Error inflating class <unknown> 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.LayoutInflater.createView(LayoutInflater.java:596) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:644) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:724) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.LayoutInflater.inflate(LayoutInflater.java:479) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.LayoutInflater.inflate(LayoutInflater.java:391) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at com.maheshbabu.app.JustIn.initialize(JustIn.java:143) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at com.maheshbabu.app.JustIn.<init>(JustIn.java:135) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at com.maheshbabu.app.MaheshBabuHomePage.showLatestPage(MaheshBabuHomePage.java:671) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at com.maheshbabu.app.MaheshBabuHomePage.onClick(MaheshBabuHomePage.java:363) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.View.performClick(View.java:3110) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.View$PerformClick.run(View.java:11934) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.os.Handler.handleCallback(Handler.java:587) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.os.Handler.dispatchMessage(Handler.java:92) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.os.Looper.loop(Looper.java:132) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.app.ActivityThread.main(ActivityThread.java:4123) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at java.lang.reflect.Method.invoke(Method.java:491) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at dalvik.system.NativeStart.main(Native Method) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527): Caused by: java.lang.reflect.InvocationTargetException 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at java.lang.reflect.Constructor.constructNative(Native Method) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at java.lang.reflect.Constructor.newInstance(Constructor.java:416) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.LayoutInflater.createView(LayoutInflater.java:576) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  ... 21 more 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527): Caused by: java.lang.OutOfMemoryError 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:483) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:738) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.content.res.Resources.loadDrawable(Resources.java:1918) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.View.<init>(View.java:2450) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.View.<init>(View.java:2389) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.view.ViewGroup.<init>(ViewGroup.java:359) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  at android.widget.RelativeLayout.<init>(RelativeLayout.java:173) 
09-30 15:23:07.490: ERROR/AndroidRuntime(5527):  ... 24 more 

回答

3

我覺得這個異常是從

setContentView(R.layout.main); 

線,這可能是由於各種原因正在添加。

1)因爲你是從potrait景觀,反之亦然

索爾改變屏幕方向)修復您的觀點對任何一個方向。實際上,在方向變化中,新視圖和新對象與舊視圖和對象一起創建。因此,把你的記憶

2)對象不釋放

SOL)中刪除的意見不會解決你的問題,你必須釋放所有與這些意見的對象。在與這些視圖相關的每個圖像上調用Bitmap.recycle()。

還檢查了這些鏈接可能對您有所幫助

How to get rid of out of memory exception

看看這個視頻這可能是非常有用的,你

Memory management for Android Apps

編碼愉快朋友

+0

嗨謝謝你的職位,但是當我試圖回收我得到像錯誤ERROR/AndroidRuntime(2289)錯誤:java.lang.RuntimeException:畫布:試圖使用回收的位圖android.graphics.Bitmap @ 41a80468 09-30 16:57:16.580:ERROR/AndroidRuntime(2289):at android.graphics.Canvas.throwIfRecycled(Canvas。java:1012) 09-30 16:57:16.580:ERROR/AndroidRuntime(2289):at android.graphics.Canvas.drawBitmap(Canvas.java:1116) 09-30 16:57:16.580:ERROR/AndroidRuntime( 2289):在android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:335) –

+0

那是因爲你正在使用回收的位圖。嘗試使用新的位圖 –

+0

非常感謝你的朋友.........視頻幫了我很多... –

0

我已經用棘手的方式解決了它。

我有兩個佈局 1)layout_splash:飛濺的佈局 2)layout_map:包含地圖片段和哪些導致崩潰的佈局;

在我的第一個活動onCreate(啓動活動 - SplashActivity.java)我做了如下。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 
     if(close){ 
      finish(); 
      System.exit(0); 
     } 

     setContentView(R.layout.layout_map); 
     setContentView(R.layout.layout_splash); 

     ....... 
     ....... 
     ....... 

    } catch (Exception e) { 
     Intent intent = new Intent(SplashScreenActivity.this,LowMemoryDialogActivity.class); 
     startActivity(intent); 
     //The below code will prevent showing crash dialog. 
     System.exit(1); 
    } 
} 


LowMemoryDialogActivity.java 

public class LowMemoryDialogActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_low_memory_dialog); 
    } 

    @Override 
    public void onBackPressed() { 
     SplashScreenActivity.close=true; 
     super.onBackPressed(); 
    } 
} 

activity_low_memory_dialog.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:gravity="center"> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Low Memory" 
     android:id="@+id/textView6" 
     android:layout_above="@+id/textView5" 
     android:layout_centerHorizontal="true" /> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Please insert SD card for proper working!" 
     android:id="@+id/textView5" 
     android:textSize="20sp" 
     android:gravity="center" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" /> 
</LinearLayout> 

通過插入的setContentView(R.layout.layout_map)第一次在一個嘗試捕捉,我們可以瞭解未來碰撞的可能性,我們就可以搞定。

相關問題