スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ProgressDialogとAsyncTaskの(おそらく)正しい使い方2

ProgressDialogとAsyncTaskのおそらく正しい使い方
の第二段です。


今度の問題ですが、Progress表示中に、キャンセル(戻るボタン)しても、AsyncTaskがキャンセルされないんだよなぁ
という問題です。

public class AsyncDemo extends Activity {
    

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new DemoAsync().execute();
    }
    
    
    
    class DemoAsync extends AsyncTask {
        private ProgressDialog mDialog;
        
        public DemoAsync() {
            this.mDialog = new ProgressDialog(AsyncDemo.this);
        }
        @Override
        protected Void doInBackground(Void... params) {
            try {
                TimeUnit.SECONDS.sleep(5l);
            } catch (InterruptedException e) {
            }
            return null;
        }

        @Override
        protected void onCancelled() {
            Log.d("", "onCancel");
            if(mDialog != null && mDialog.isShowing()) {
                mDialog.dismiss();
            }
            super.onCancelled();
        }

        @Override
        protected void onPostExecute(Void result) {
            Log.d("", "onPostExecute");
            super.onPostExecute(result);
            if(mDialog != null && mDialog.isShowing()) {
                mDialog.dismiss();
            }
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mDialog.setIndeterminate(true);
            mDialog.setMessage("Dialog");
            mDialog.show();
        }
    }
}

はい。前回も出てきたオーソドックスっぽい使い方ですが、
今度はちゃんとAsyncTaskがキャンセルされるようにします。


結局の所、
ProgressDialogがキャンセルされるだけで、AsyncTaskは動きっぱなしということですので、
ProgressDialogをキャンセル不可にするのでなければ、ProgressDialogのキャンセルイベントをハンドリングしてやります。

以下を追加するだけですね。
mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        DemoAsync.this.cancel(true);
    }
});

DemoAsync.thisについては、気持ち悪さや、コストなどを加味して、
外側にて、AsyncTaskのインスタンスをfinalで参照しておくなりして、その参照にたいしてcancelしてやるなど
適当にかましてください。



ちなみにですが、
キャンセル時のDialog#dismissですが、
java.lang.IllegalArgumentException: View not attached to window manager
などが勢いあまった連打で発生する事があるので、
握りつぶしてやると幸せになれるか、不幸になれるかのどちらかです
関連記事

コメントの投稿

非公開コメント

スポンサードリンク
アプリ一覧
最新記事
最新コメント
最新トラックバック
検索フォーム
月別アーカイブ
カテゴリ
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。