2016-04-02 12 views
0

画面の向きを変更すると、次の例外を除いてアプリケーションがクラッシュします。私はImageViewsと何か関係があり、エミュレータのメモリが不足していると思いますが、スタックトレースを理解するのに問題があります。 ProfileActivity.javaでオリエンテーション変更時のInflateException

(ここで、私は向きが変更できるようにしたいと思います)、私はこのような私のImageViewsのインスタンスを保存し、復元しようとするが、それが動作していないようです:

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

    if(savedInstanceState != null){ 
     ratingImages = (List<ImageView>) savedInstanceState.getSerializable("ratingImages"); 
    } 
} 

@Override protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("ratingImages", (Serializable) ratingImages); 
} 

@Override public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

} 

はしかし、私は、以下のランタイム例外を取得:

04-01 17:34:29.836 25455-25455/com.myapp.myapp E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.myapp.myapp, PID: 25455 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.ProfileActivity}: android.view.InflateException: Binary XML file line #269: Binary XML file line #269: Error inflating class <unknown> 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077) 
    at android.app.ActivityThread.-wrap15(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: android.view.InflateException: Binary XML file line #269: Binary XML file line #269: Error inflating class <unknown> 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:539) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:257) 
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109) 
    at com.myapp.myapp.ProfileActivity.onCreate(ProfileActivity.java:46) 
    at android.app.Activity.performCreate(Activity.java:6237) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077)  
    at android.app.ActivityThread.-wrap15(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5417)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
Caused by: android.view.InflateException: Binary XML file line #269: Error inflating class <unknown> 
    at android.view.LayoutInflater.createView(LayoutInflater.java:645) 
    at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58) 
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:694) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:762) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:257)  
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)  
    at com.myapp.myapp.ProfileActivity.onCreate(ProfileActivity.java:46)  
    at android.app.Activity.performCreate(Activity.java:6237)  
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)  
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)  
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077)  
    at android.app.ActivityThread.-wrap15(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5417)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Constructor.newInstance(Native Method) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:619) 
    at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)  
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:694)  
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:762)  
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:257)  
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)  
    at com.myapp.myapp.ProfileActivity.onCreate(ProfileActivity.java:46)  
    at android.app.Activity.performCreate(Activity.java:6237)  
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)  
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)  
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077)  
    at android.app.ActivityThread.-wrap15(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5417)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
Caused by: java.lang.OutOfMemoryError: Failed to allocate a 4284912 byte allocation with 2835528 free bytes and 2MB until OOM 
    at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609) 
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444) 
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080) 
    at android.content.res.Resources.loadDrawableForCookie(Resources.java:2635) 
    at android.content.res.Resources.loadDrawable(Resources.java:2540) 
    at android.content.res.TypedArray.getDrawable(TypedArray.java:870) 
    at android.widget.ImageView.<init>(ImageView.java:152) 
    at android.widget.ImageView.<init>(ImageView.java:140) 
    at android.widget.ImageView.<init>(ImageView.java:136) 
    at java.lang.reflect.Constructor.newInstance(Native Method)  
    at android.view.LayoutInflater.createView(LayoutInflater.java:619)  
    at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)  
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:694)  
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:762)  
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)  
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:257)  
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)  
    at com.myapp.myapp.ProfileActivity.onCreate(ProfileActivity.java:46)  
    at android.app.Activity.performCreate(Activity.java:6237)  
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)  
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)  
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077)  
    at android.app.ActivityThread.-wrap15(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5417)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

EDIT:私は物理デバイス上でこれを試みたが、それはクラッシュしません。しかし、私はまだエミュレータでこの問題を回避する最良の方法を知りたいです。私はエミュレータ上のメモリが不足していると、向きの変更にImageViewsを正しく処理していない可能性があります。

ご協力いただければ幸いです。ありがとう!

答えて

2

が、私はそれが

より正確にメモリ不足にエミュレータを引き起こしImageViewsとは何かを持っていると信じて、それはあなたが直接の原因であるImageViewウィジェットに入れている画像ですクラッシュの

しかし、私はスタックトレースの理解に問題があります。

は、どのようなレイアウトあなたがそのonCreate()方法では、com.myapp.myapp.ProfileActivityに膨らまされている(ライン46)、デコード時に、ロードされたとき、4284912バイトを必要とする描画可能リソースを指すImageViewを持っています。これは1035ピクセルx 1035ピクセルのイメージに相当します。

これはかなり大きいです。

さらに、十分な大きさの空きメモリブロックはありません。これは、全体的に2 MBのヒープ・スペースしか使用できないため、すでに多くのメモリーを消費しているためです。

私はできません。この

のような私ImageViewsのインスタンスを保存し、復元してみてください。

技術的には、レイアウトを見て、ImageViewウィジェットを見つけ、どのイメージが非常に大きなイメージであるかを見つけ出し、非常に大きなイメージの使用を停止します。また、使用しているリソースディレクトリを確認し、低密度スクリーン用の低解像度バージョンの使用を検討することもできます。

戦略的には、メモリ消費の所有権を取得する必要があります。ヒープ・ダンプを生成し、Android Studio(または他の場所)のツールを使用して、ヒープ内にあるものとそれほど多くのスペースを占めるものを確認することができます。残念ながら、GoogleではAndroidスタジオでヒープ解析ツールを文書化するのに気にしませんでしたが、this bit of documentationはメモリ管理の他の側面をカバーしており、ヒープ使用量のリアルタイムグラフを表示するthis pageがメモリモニタをカバーしていますヒープダンプ、ツールバーボタン経由)

関連する問題