0

私の monodroid アプリケーションには、ユーザーが回転できるアクティビティがあります。何度か背中合わせに回転させると、このエラーが発生します:

 12-17 11:58:40.367: E/WindowManager(2115): Activity myapp.myActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405bc398 that was originally added here
12-17 11:58:40.367: E/WindowManager(2115): android.view.WindowLeaked: Activity myapp.myActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405bc398 that was originally added here
12-17 11:58:40.367: E/WindowManager(2115):  at android.view.ViewRoot.<init>(ViewRoot.java:275)
12-17 11:58:40.367: E/WindowManager(2115):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
12-17 11:58:40.367: E/WindowManager(2115):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
12-17 11:58:40.367: E/WindowManager(2115):  at android.view.Window$LocalWindowManager.addView(Window.java:430)
12-17 11:58:40.367: E/WindowManager(2115):  at android.app.Dialog.show(Dialog.java:288)
12-17 11:58:40.367: E/WindowManager(2115):  at myapp.myActivity.n_onCreate(Native Method)
12-17 11:58:40.367: E/WindowManager(2115):  at myapp.myActivity.onCreate(PropertyShowActivity.java:77)
12-17 11:58:40.367: E/WindowManager(2115):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
12-17 11:58:40.367: E/WindowManager(2115):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1780)
12-17 11:58:40.367: E/WindowManager(2115):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837)
12-17 11:58:40.367: E/WindowManager(2115):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3242)
12-17 11:58:40.367: E/WindowManager(2115):  at android.app.ActivityThread.access$1600(ActivityThread.java:132)
12-17 11:58:40.367: E/WindowManager(2115):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1037)
12-17 11:58:40.367: E/WindowManager(2115):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-17 11:58:40.367: E/WindowManager(2115):  at android.os.Looper.loop(Looper.java:143)
12-17 11:58:40.367: E/WindowManager(2115):  at android.app.ActivityThread.main(ActivityThread.java:4196)
12-17 11:58:40.367: E/WindowManager(2115):  at java.lang.reflect.Method.invokeNative(Native Method)
12-17 11:58:40.367: E/WindowManager(2115):  at java.lang.reflect.Method.invoke(Method.java:507)
12-17 11:58:40.367: E/WindowManager(2115):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-17 11:58:40.367: E/WindowManager(2115):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-17 11:58:40.367: E/WindowManager(2115):  at dalvik.system.NativeStart.main(Native Method)
12-17 11:58:40.377: W/MapActivity(2115): Recycling dispatcher android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher@40626398

これが何なのかわかりません。どんな体でも私を助けることができますか?

上記のエラーの前に、次の情報もあります。

Recycling dispatcher android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher@40626398

リサイクル マップ オブジェクト。ターゲット GC ヒープを 33.796MB から 32.000MB にクランプします。このプロセスには 395280 バイトの外部割り当てが大きすぎます。VM で 395280 バイトを割り当てられない ターゲット GC ヒープを 33.789MB から 32.000MB にクランプする

Universal Image Loader で読み込まれるアクティビティに画像がいくつかありますが、それが原因ですか? それが本当なら、どうすればこれを解決できますか?

4

3 に答える 3

0

どこかでメモリリークを作成した可能性があります。Gui オブジェクトへの参照を保存していないかどうかを確認してください。

于 2012-12-17T08:56:31.713 に答える
0

OnCreate() メソッドで Dialog (または Dialog から派生したクラス) を作成しているようです。Dialog は、リークする内部クラス PhoneWindow を使用します。デバイスをローテーションすると、ライフサイクル全体でアクティビティが実行されるため、ダイアログをクリーンアップする必要があります。推奨される場所は OnPause() メソッドです。

protected override void OnPause()
{
   base.OnPause();

   if (this.dlg != null)
      this.dlg.Dismiss();
}

アクティビティのライフサイクルについては、 https ://developer.android.com/reference/android/app/Activity.html で説明しています。

于 2012-12-17T09:27:12.970 に答える
0

レイアウトを変更したり、コントロールやレイアウトを再構成/リロードしたりする必要がない場合は、次のような属性変更を追加することを検討してください。

[Activity(Label = "MyActivity", Icon = "@drawable/MyActivity", Theme = "@style/AppTheme"
                , ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation)]

Android.Content.PM.ConfigChanges.Orientationプロパティは、向きの変更を手動で処理する必要があることをアクティビティに通知します。したがって、アクティビティを再起動せずにビューを回転させたい場合は、その属性を変更することで問題が解決するはずです。

レイアウトを変更する必要がある場合、または向きの変更に対してアクションを実行する必要がある場合は、OnConfigurationChangedメソッドをオーバーライドする必要があります。

このプロセスの詳細については、Xamarin Docs サイトを参照してください。「アクティビティの再起動の防止」セクションを参照してください。

于 2012-12-17T15:11:48.350 に答える