亲爱的 Android 黑客, 我正在尝试在我的 Android 应用程序中执行以下操作:当用户单击 ListActivity 中的列表项时,应该显示 ProgressDialog,应该进行一些预加载,完成后,应该使用 Intent 调用另一个 Activity。
我尝试了不同的方法。根本不起作用的是使用异步任务。显然,如果该类不是我的原始 Activity 的成员,我无法从异步任务中显示、关闭或编辑我的 ProgressDialog。
然后我切换到一个简单的线程,这就是我尝试这样做的方式:
dialog = ProgressDialog.show(BookmarkActivity.this, "", "Loading...",true);
new Thread() {
public void run() {
// do something
dialog.setMessage("Change Message...");
// do more
dialog.dismiss();
// ...
Intent intent = new Intent(BookmarkActivity.this, ThreadActivity.class);
BookmarkActivity.this.startActivity(intent);
}
}.start();
这几乎可以工作,但对话框消息的更改不会。我收到有关“泄漏的窗口”的错误消息。 (如果需要,我可以发布完整的日志)。
我的问题:
- 如果类有自己的文件,我如何为此使用异步任务?
- 如何从我的线程或 AsyncTask 中更改 ProgressDialog 而不会导致在另一个线程中更改 UI 时出错?
提前致谢,简·奥利弗
好的,在 Jason 的帮助下,我将这个异步任务组合在一起。 有效!
public class ThreadPreLoader extends AsyncTask<Object, String, Void> {
private Activity mActivity;
private ProgressDialog mDialog;
public ThreadPreLoader(Activity activity) {
mActivity = activity;
}
protected void onPreExecute() {
mDialog = new ProgressDialog(mActivity);
mDialog.setMessage("Loading...");
mDialog.show();
}
protected Void doInBackground(Object... args) {
publishProgress("Loading something else..");
return null;
}
protected void onProgressUpdate(String... msg) {
mDialog.setMessage(msg[0]);
}
protected void onPostExecute(Void result) {
mDialog.dismiss();
}
}
再次感谢杰森。
最佳答案
您应该使用 Async Task
,定义一个自定义 Async Task
,它接收原始 Activity 的上下文 (this
)。
然后保留该上下文以供以后关闭对话框。
从您的 doInBackground()
方法中,您可以调用 postProgress( int progress)
这将导致 onProgressUpdate()
在 async 中被调用task
,该方法在UI线程上,不会造成跨线程错误。
一旦 doInBackground()
完成,方法 onComplete()
也将在 UI 线程上调用,这是您可以使用保存的上下文并关闭对话框的地方(context.dissmissDialog()
关于Android:ProgressDialog 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4172461/