我的程序运行正常,但在程序运行过程中,用户单击BACK按钮,后退按钮的功能不起作用。但在完成执行后,BACK按钮功能正在运行。
请在这里查看我的代码。
package com.sampleexample;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class SampleExample extends Activity {
static final int PROGRESS_DIALOG = 0;
Button button;
TextView download;
ProgressThread progressThread;
ProgressDialog progressDialog;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("SampleExample", "======= onCreate()====Start====");
// Setup the button that starts the progress dialog
download = (TextView) findViewById(R.id.download);
button = (Button) findViewById(R.id.progressDialog);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Log.d("SampleExample", "======= onClick()==Start======");
showDialog(PROGRESS_DIALOG);
Log.d("SampleExample", "======= onClick()===End=====");
}
});
Log.d("SampleExample", "======= onCreate()====End====");
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// Handle the back button
if (keyCode == KeyEvent.KEYCODE_BACK) {
// Ask the user if they want to quit
Log.d("SampleExample", " ------- Back Button onKeyDown()----Start--");
new AlertDialog.Builder(this).setIcon(
android.R.drawable.ic_dialog_alert).setTitle("Exit")
.setMessage("Are you sure you want to leave?")
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// Exit the activity
SampleExample.this.finish();
}
}).show();
// Say that we've consumed the event
Log.d("SampleExample", " ------BackButton-onKeyDown()----End--");
return true;
}
return super.onKeyDown(keyCode, event);
}
// Toast.makeText(SampleExample.this, "U have pressed the Back Button",
// Toast.LENGTH_SHORT).show();
// Log.d(this.getClass().getName(),
// "*********back button pressed----------");
protected Dialog onCreateDialog(int id) {
Log.d("SampleExample", "99999 onCreateDialog () 999 Start");
switch (id) {
case PROGRESS_DIALOG:
progressDialog = new ProgressDialog(SampleExample.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
download.setText("Now downloading.......");
progressThread = new ProgressThread(handler);
progressThread.start();
return progressDialog;
default:
return null;
}
}
// Define the Handler that receives messages from the thread and update the
// progress
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
Log.d("SampleExample", "8888 handleMessage () 8888 Start");
int total = msg.getData().getInt("total");
progressDialog.setProgress(total);
if (total >= 100) {
// Toast.makeText(SampleExample.this, "Download is completed",
// Toast.LENGTH_SHORT).show();
download.setText(" download is completed.");
dismissDialog(PROGRESS_DIALOG);
progressThread.setState(ProgressThread.STATE_DONE);
}
}
};
/** Nested class that performs progress calculations (counting) */
private class ProgressThread extends Thread {
Handler mHandler;
final static int STATE_DONE = 0;
final static int STATE_RUNNING = 1;
int mState;
int total;
ProgressThread(Handler h) {
mHandler = h;
}
public void run() {
mState = STATE_RUNNING;
total = 0;
Log.d("SampleExample", "7777 run () 7777 Start");
while (mState == STATE_RUNNING) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Log.e("ERROR", "Thread Interrupted");
}
Message msg = mHandler.obtainMessage();
Bundle b = new Bundle();
b.putInt("total", total);
msg.setData(b);
mHandler.sendMessage(msg);
total++;
}
Log.d("SampleExample", "6666 run () 6666 End");
}
/*
* sets the current state for the thread, used to stop the thread
*/
public void setState(int state) {
mState = state;
}
}
}
答案 0 :(得分:1)
您没有真正清楚地解释问题的症状,但是从您的代码中可以看出,您正在开始后台线程并弹出ProgressDialog
。我假设正在运行时您正在尝试按BACK键。这似乎没有做任何事情的原因是Dialog
默认情况下不能使用BACK键取消。您必须致电setCancelable(true)
才能启用此行为。
case PROGRESS_DIALOG:
progressDialog = new ProgressDialog(SampleExample.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(true);
...
return progressDialog;
这将允许使用BACK按钮取消ProgressDialog
。但是,即使已取消Thread
,您的后台Dialog
也会继续投放。
答案 1 :(得分:1)
// handle phone back button
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return quitWithPID();
}
return super.onKeyDown(keyCode, event);
}
// reusable method (modifier may be public..)
private boolean quitWithPID() {
new AlertDialog.Builder(this).setIcon(
android.R.drawable.ic_dialog_alert).setTitle("Exit Boot Options?")
.setMessage("Are you sure you want to exit?")
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Exit the activity
MainActivity.this.finish();
// Terminate the process ;)
android.os.Process.killProcess(android.os.Process.myPid());
}
}).show();
return true;
}
答案 2 :(得分:0)
chandu你是否在发布问题之前检查了你的逻辑
重新检查处理程序中的以下代码
if (total >= 100) {
download.setText(" download is completed.");
dismissDialog(PROGRESS_DIALOG);
progressThread.setState(ProgressThread.STATE_DONE);
}
你的代码不会达到dismissDialog,直到总数> = 100&因此,即使在程序中你也无法使用你的BACK的动作
&安培;也请停止发布multiple questions