onBackpressメソッドまたはonKeyDownメソッドをクリックすると、応答できない問題解決策が発生します.

2624 ワード

一般的に、携帯電話のbackキーをクリックすると、activityのonbackpress()メソッドが直接呼び出されたり、クリックイベントをキャプチャしたりすることができます.
   @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK ) { 
                mProgressDialog.dismiss();
                //      
                cancelLoad();
            }
            return super.onKeyDown(keyCode, event);
        }

しかし、場合によっては、ダイアログボックスに表示されたときなど、イベントがキャプチャされない場合があります.
現在、ネットワークにアクセスする操作に参加するのに時間がかかるため、progressdialogを使用してネットワーク操作を行っている進捗状況を表示しますが、ユーザーがイベントを待つのが長すぎると感じたら、直接ネットワークアプリケーションインタフェースを終了し、他のことをしたいと思っている可能性があります.この場合、backキーをクリックするとdilogをオフにする必要があります.同時にAsyncTaskをオフにし、http操作を中断します(この部分は後で詳しくまとめます).
dialogセクションのソースコードを観察すると、次のようになります.
 
  /**
     * Called when the dialog has detected the user's press of the back
     * key.  The default implementation simply cancels the dialog (only if
     * it is cancelable), but you can override this to do whatever you want.
     */
    public void onBackPressed() {
        if (mCancelable) {
            cancel();
        }
    }

      progressdialog     ,    back       dialog   onbackPressed   ,    progressdialog     ,     back    ,   onbackPressed         ,      :
     dialog    progressdialog   dialog        :

    class myDialog extends ProgressDialog{
        private Context context;
        
        public myDialog(Context context){
           super(context);
        }

        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK ) { 
                mProgressDialog.dismiss();
                //      
                cancelLoad();
            }
            return super.onKeyDown(keyCode, event);
        }
    }

これにより、ウィンドウに表示されるactivityがある場合に、この方法でbackキーの後退の動作応答をキャプチャし、所望の操作を実現することができ、上述したようにasyncのcancel操作を行いたい.
   class LoadSearchTask extends AsyncTask> {

        public void cancelTask() {
            Status status = getStatus();
            MyLog.d("status = " + status);
            switch (status) {
                case PENDING:
                    cancel(true);
                    break;
                case RUNNING:
                    cancel(true);
                    Net.abort();
                    break;
                case FINISHED:
                    cancel(true);
                    break;
                default:
                    break;
            }
        }

基本的な実装プロセスはこのようにして、スクリーンショットがあればいいです.