進行状況ダイアログとバックグラウンドスレッドがアクティブなときに画面の向きの変更を処理するにはどうすればよいでしょうか? 質問する

進行状況ダイアログとバックグラウンドスレッドがアクティブなときに画面の向きの変更を処理するにはどうすればよいでしょうか? 質問する

私のプログラムは、バックグラウンド スレッドでネットワーク アクティビティを実行します。開始する前に、進行状況ダイアログがポップアップ表示されます。ダイアログはハンドラーで閉じられます。ダイアログが表示されている間 (バックグラウンド スレッドが実行中) に画面の向きが変わる場合を除いて、すべて正常に動作します。この時点で、アプリはクラッシュするか、デッドロックするか、すべてのスレッドが強制終了されるまでアプリがまったく動作しない奇妙な段階になります。

画面の向きの変更を適切に処理するにはどうすればよいでしょうか?

以下のサンプル コードは、実際のプログラムの動作とほぼ一致しています。

public class MyAct extends Activity implements Runnable {
    public ProgressDialog mProgress;

    // UI has a button that when pressed calls send

    public void send() {
         mProgress = ProgressDialog.show(this, "Please wait", 
                      "Please wait", 
                      true, true);
        Thread thread = new Thread(this);
        thread.start();
    }

    public void run() {
        Thread.sleep(10000);
        Message msg = new Message();
        mHandler.sendMessage(msg);
    }

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            mProgress.dismiss();
        }
    };
}

スタック:

E/WindowManager(  244): Activity MyAct has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@433b7150 that was originally added here
E/WindowManager(  244): android.view.WindowLeaked: Activity MyAct has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@433b7150 that was originally added here
E/WindowManager(  244):     at android.view.ViewRoot.<init>(ViewRoot.java:178)
E/WindowManager(  244):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:147)
E/WindowManager(  244):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:90)
E/WindowManager(  244):     at android.view.Window$LocalWindowManager.addView(Window.java:393)
E/WindowManager(  244):     at android.app.Dialog.show(Dialog.java:212)
E/WindowManager(  244):     at android.app.ProgressDialog.show(ProgressDialog.java:103)
E/WindowManager(  244):     at android.app.ProgressDialog.show(ProgressDialog.java:91)
E/WindowManager(  244):     at MyAct.send(MyAct.java:294)
E/WindowManager(  244):     at MyAct$4.onClick(MyAct.java:174)
E/WindowManager(  244):     at android.view.View.performClick(View.java:2129)
E/WindowManager(  244):     at android.view.View.onTouchEvent(View.java:3543)
E/WindowManager(  244):     at android.widget.TextView.onTouchEvent(TextView.java:4664)
E/WindowManager(  244):     at android.view.View.dispatchTouchEvent(View.java:3198)

onSaveInstanceState で進行状況ダイアログを閉じようとしましたが、それは即時のクラッシュを防ぐだけです。バックグラウンド スレッドはまだ実行されており、UI は部分的に描画された状態です。再び動作を開始する前に、アプリ全体を強制終了する必要があります。

ベストアンサー1

編集: Googleのエンジニアは、ダイアン・ハックボーン(別名ハックボッド)このStackOverflowの投稿。 チェックアウトこのブログ投稿詳細については。


マニフェストのアクティビティ宣言にこれを追加する必要があります:

android:configChanges="orientation|screenSize"

それは次のようになります

<activity android:label="@string/app_name" 
        android:configChanges="orientation|screenSize|keyboardHidden" 
        android:name=".your.package">

問題は、構成の変更が発生するとシステムがアクティビティを破棄することです。構成の変更

そのため、これを構成ファイルに配置すると、システムがアクティビティを破棄することが回避されます。代わりに、onConfigurationChanged(Configuration)メソッドが呼び出されます。

おすすめ記事