我有这个问题:在长时间操作期间,我显示一个ProgressBar
. 有时,在此操作期间,程序必须向用户索取一些信息。
然后,我想显示 a DialogBox
,但如果这样做,我会收到错误消息,因为 aDialogBox
期间无法显示 a Thread
。
我该如何解决我的问题?
我有这个问题:在长时间操作期间,我显示一个ProgressBar
. 有时,在此操作期间,程序必须向用户索取一些信息。
然后,我想显示 a DialogBox
,但如果这样做,我会收到错误消息,因为 aDialogBox
期间无法显示 a Thread
。
我该如何解决我的问题?
请使用 AsyncTask 而不是线程,那么它将起作用,您无法在线程中执行 UI 相关的工作。
AsyncTask 允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。
阅读 AsyncTask
http://developer.android.com/reference/android/os/AsyncTask.html
Android 支持使用标准 Java Thread 类来执行异步处理。
Android 还提供 java.util.concurrent 包以在后台执行某些操作,例如使用 ThreadPools 和 Executor 类。
如果需要从新的线程更新用户界面,则需要与用户界面线程同步。
http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html
我想这就是你想要的。
开始操作:-
new StartTask().execute("");
StartTask 类:-
public class StartTask extends AsyncTask<String, Integer, String> {
private ProgressDialog pdialog;
@Override
protected void onPreExecute() {
// UI work allowed here
pdialog = new ProgressDialog(syncContext);
// setup dialog here
pdialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pdialog.setMessage("Updating...");
pdialog.setCancelable(false);
pdialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
if(pdialog != null) {
pdialog.dismiss();
}
if(progress[0] == 0) {
AlertDialog.Builder alertbox = new AlertDialog.Builder(context);
alertbox.setCancelable(false);
alertbox.setMessage("This is first Alert").setPositiveButton("OK",
new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
pdialog.show();
}
});
alertbox.create();
alertbox.show();
} else if(progress[0] == 1) {
AlertDialog.Builder alertbox = new AlertDialog.Builder(context);
alertbox.setCancelable(false);
alertbox.setMessage("This is second Alert").setPositiveButton("OK",
new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
pdialog.show();
}
});
alertbox.create();
alertbox.show();
}
}
@Override
protected void onPostExecute(String returnVal) {
// UI work allowed here
if(pdialog != null) {
pdialog.dismiss();
}
}
@Override
protected String doInBackground(String... params) {
for(int i = 0; i < 3; i++) {
//do some work here
publishProgress(i);
}
}
}