onBackpressメソッドまたはonKeyDownメソッドをクリックすると、応答できない問題解決策が発生します.
2624 ワード
一般的に、携帯電話のbackキーをクリックすると、activityのonbackpress()メソッドが直接呼び出されたり、クリックイベントをキャプチャしたりすることができます.
しかし、場合によっては、ダイアログボックスに表示されたときなど、イベントがキャプチャされない場合があります.
現在、ネットワークにアクセスする操作に参加するのに時間がかかるため、progressdialogを使用してネットワーク操作を行っている進捗状況を表示しますが、ユーザーがイベントを待つのが長すぎると感じたら、直接ネットワークアプリケーションインタフェースを終了し、他のことをしたいと思っている可能性があります.この場合、backキーをクリックするとdilogをオフにする必要があります.同時にAsyncTaskをオフにし、http操作を中断します(この部分は後で詳しくまとめます).
dialogセクションのソースコードを観察すると、次のようになります.
これにより、ウィンドウに表示されるactivityがある場合に、この方法でbackキーの後退の動作応答をキャプチャし、所望の操作を実現することができ、上述したようにasyncのcancel操作を行いたい.
基本的な実装プロセスはこのようにして、スクリーンショットがあればいいです.
@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;
}
}
基本的な実装プロセスはこのようにして、スクリーンショットがあればいいです.