0

ページのビューを縦向きから横向きに変更し、複数回 (つまり、連続して 5 ~ 15 回) 変更すると、アプリがクラッシュします。エラーテキストは次のとおりです。

09-07 16:18:16.976: D/AndroidRuntime(4215): Shutting down VM
09-07 16:18:16.976: W/dalvikvm(4215): threadid=1: thread exiting with uncaught exception (group=0x40a2d1f8)
09-07 16:18:16.992: E/AndroidRuntime(4215): FATAL EXCEPTION: main
09-07 16:18:16.992: E/AndroidRuntime(4215): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.mobileTimerClock/com.android.mobileTimerClock.TimeClockDashBoard}: android.view.InflateException: Binary XML file line #3: Error inflating class <unknown>
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3351)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.access$700(ActivityThread.java:123)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1151)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.os.Handler.dispatchMessage(Handler.java:99)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.os.Looper.loop(Looper.java:137)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.main(ActivityThread.java:4424)
09-07 16:18:16.992: E/AndroidRuntime(4215): at java.lang.reflect.Method.invokeNative(Native Method)
09-07 16:18:16.992: E/AndroidRuntime(4215): at java.lang.reflect.Method.invoke(Method.java:511)
09-07 16:18:16.992: E/AndroidRuntime(4215): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-07 16:18:16.992: E/AndroidRuntime(4215): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-07 16:18:16.992: E/AndroidRuntime(4215): at dalvik.system.NativeStart.main(Native Method)
09-07 16:18:16.992: E/AndroidRuntime(4215): Caused by: android.view.InflateException: Binary XML file line #3: Error inflating class <unknown>
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.createView(LayoutInflater.java:606)
09-07 16:18:16.992: E/AndroidRuntime(4215): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
09-07 16:18:16.992: E/AndroidRuntime(4215): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.Activity.setContentView(Activity.java:1835)
09-07 16:18:16.992: E/AndroidRuntime(4215): at com.android.mobileTimerClock.TimeClockDashBoard.onCreate(TimeClockDashBoard.java:488)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.Activity.performCreate(Activity.java:4465)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
09-07 16:18:16.992: E/AndroidRuntime(4215): ... 12 more
09-07 16:18:16.992: E/AndroidRuntime(4215): Caused by: java.lang.reflect.InvocationTargetException
09-07 16:18:16.992: E/AndroidRuntime(4215): at java.lang.reflect.Constructor.constructNative(Native Method)
09-07 16:18:16.992: E/AndroidRuntime(4215): at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.createView(LayoutInflater.java:586)
09-07 16:18:16.992: E/AndroidRuntime(4215): ... 24 more
09-07 16:18:16.992: E/AndroidRuntime(4215): Caused by: java.lang.OutOfMemoryError
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.Bitmap.nativeCreate(Native Method)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.content.res.Resources.loadDrawable(Resources.java:1935)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.View.<init>(View.java:2785)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.ViewGroup.<init>(ViewGroup.java:385)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.widget.FrameLayout.<init>(FrameLayout.java:99)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.widget.ScrollView.<init>(ScrollView.java:152)
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.widget.ScrollView.<init>(ScrollView.java:148)
09-07 16:18:16.992: E/AndroidRuntime(4215): ... 27 more
09-07 16:18:17.078: W/ActivityManager(181): Force finishing activity com.android.mobileTimerClock/.TimeClockDashBoard 
4

2 に答える 2

3

を取得していOutOfMemoryErrorます。あなたの活動はどのようなものですか?使用している Android のバージョンは何ですか? アクティビティに大きなビットマップまたは WebView がありますか?

より多くの情報を提供するか、自分でメモリ リークを見つけてください。Eclipse Memory Analyzerは、役立つツールです。破棄されているアクティビティへの参照を保持しているものがあるかどうかを確認することができます。これにより、アクティビティがガベージ コレクションされるのを防ぐことができます。このブログ投稿では、基本的な使い方のヒントをいくつか紹介しています。

更新:AsyncTaskインスタンスは、おそらくそのホスト アクティビティへの参照を保持しています。AsynTaskこれは、あなたがアクティビティの非静的内部クラスである場合に特に当てはまります。そのため、回転すると新しいタスクが開始され、明示的に停止する操作を行わない限り、既存のタスクは実行され続けます。

これらのタスクがホスト アクティビティへの参照に固執すると、メモリの問題が発生する可能性があります。

これに対する解決策については、Mark Murphy のブログ投稿を参照してください。

サンプル プロジェクトは、AsyncTask の実装を静的内部クラスとして示しています。タスクは onRetainNonConfigurationInstance() で返され、ホスティング アクティビティは、向きの変更の前後に、AsyncTask が使用する正しいアクティビティ インスタンスを認識していることを確認する責任があります。

基本的に、タスクから破棄されるホスト アクティビティを適切に「切り離す」必要があります。そこからはあなた次第です。実行中のタスクを古いアクティビティから新しいアクティビティに渡すか、実行を強制的に停止することができます。ここで重要なのは、 staticでない限り、内部クラスを使用しないことです。AsynTask

于 2012-09-13T18:05:44.433 に答える
-1

OutOfMemoryExceptionアクティビティが破棄されて再作成されるときに、一部のオブジェクト (ほとんどの場合、ビットマップ) が破棄/解放されないため、おそらく取得しています。

最初にコードを調べて、メモリ リークがある場合はそれを見つけて削除します。

次に、アクティビティに大きなビットマップまたは背景がある場合は、このクラスからアクティビティを拡張してみてください: (それは私にとってはうまくいきました)

public abstract class AdvancedActivity extends Activity
{

  @Override
  protected void onResume()
  {
    System.gc();
    super.onResume();
  }

  @Override
  protected void onPause()
  {
    super.onPause();
    System.gc();
  }

  @Override
  public void setContentView(int layoutResID)
  {
    ViewGroup mainView = (ViewGroup)
      LayoutInflater.from(this).inflate(layoutResID, null);

    setContentView(mainView);
  }

  @Override
  public void setContentView(View view)
  {
    super.setContentView(view);
    m_contentView = (ViewGroup)view;
  }

  @Override
  public void setContentView(View view, LayoutParams params)
  {
    super.setContentView(view, params);

    m_contentView = (ViewGroup)view;
  }

  @Override
  protected void onDestroy()
  {
    super.onDestroy();

    // Fixes android memory  issue 8488 :
    // http://code.google.com/p/android/issues/detail?id=8488
    nullViewDrawablesRecursive(m_contentView);

    m_contentView = null;
    System.gc();
  }

  private void nullViewDrawablesRecursive(View view)
  {
    if(view != null)
    {
      try
      {
        if (view instanceof ViewGroup) {  
            ViewGroup viewGroup = (ViewGroup)view;
            int childCount = viewGroup.getChildCount();
            for(int index = 0; index < childCount; index++)
            {
              nullViewDrawablesRecursive(viewGroup.getChildAt(index));
            }
        }   
      }
      catch(Exception e)
      {          
      }

      nullViewDrawable(view);
    }    
  }

  private void nullViewDrawable(View view)
  {
    try
    {
      view.setBackgroundDrawable(null);
    }
    catch(Exception e)
    {          
    }

    try
    {
      ImageView imageView = (ImageView)view;
      imageView.setImageDrawable(null);
      imageView.setBackgroundDrawable(null);
    }
    catch(Exception e)
    {          
    }
  }

  // The top level content view.
  private ViewGroup m_contentView = null;
}

アクティビティが破棄されている場合、ドローアブルを無効にしようとします。標準的で良い方法ではありませんが、少なくとも2回転後にOOMを取得していたときはうまくいきました!

于 2012-09-13T18:19:27.030 に答える