当点击onBackpress方法或者onKeyDown方法时出现不能响应的问题解决办法


一般来讲,当我们点击手机上的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;
            }
        }

基本实现过程就这样,有个截图就好了
























 
  
 
  
 
  
 
 

你可能感兴趣的:(当点击onBackpress方法或者onKeyDown方法时出现不能响应的问题解决办法)