Android:ProgressDialog的问题

Android:ProgressDialog的问题,android,multithreading,Android,Multithreading,亲爱的安卓黑客:, 我尝试在我的Android应用程序中执行以下操作:当用户单击ListActivity中的列表项时,应显示一个ProgressDialog,应进行一些预加载,完成后,应使用intent调用另一个活动 我尝试了不同的方法。根本不起作用的是使用异步任务。显然,如果该类不是原始活动的成员,我无法在异步任务之外显示、取消或编辑ProgressDialog 然后我切换到一个简单的线程,这就是我尝试的方式: dialog = ProgressDialog.show(BookmarkActi

亲爱的安卓黑客:, 我尝试在我的Android应用程序中执行以下操作:当用户单击ListActivity中的列表项时,应显示一个ProgressDialog,应进行一些预加载,完成后,应使用intent调用另一个活动

我尝试了不同的方法。根本不起作用的是使用异步任务。显然,如果该类不是原始活动的成员,我无法在异步任务之外显示、取消或编辑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();
这几乎可以工作,但对话框消息的更改却不能。我在说“漏窗”时出错了。(如果需要,我可以发布完整的日志)

我的问题是:

  • 在类有自己的文件的情况下,如何使用异步任务
  • 如何在我的线程或异步任务中更改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();
    }
}
公共类线程预加载程序扩展异步任务{
私人活动能力;
私人住宅;
公共线程预加载程序(活动){
活动性=活动性;
}
受保护的void onPreExecute(){
mDialog=新进度对话框(mActivity);
mDialog.setMessage(“加载…”);
mDialog.show();
}
受保护的Void doInBackground(对象…args){
publishProgress(“加载其他内容”);
返回null;
}
受保护的void onProgressUpdate(字符串…msg){
mDialog.setMessage(消息[0]);
}
受保护的void onPostExecute(void结果){
mDialog.discouse();
}
}

再次感谢,Jason。

您应该使用
异步任务
,定义一个自定义
异步任务
,该任务接收原始活动的上下文(
)。 然后保留该上下文,以便以后取消该对话框。 通过
doInBackground()
方法,您可以调用
postProgress(int-progress)
,这将导致在
异步任务中调用
onProgressUpdate()
,此方法位于UI线程上,因此不会导致跨线程错误。 一旦
doInBackground()
完成,UI线程上也将调用方法
onComplete()
,在这里您可以使用保存的上下文并取消对话框(
context.dismissdialog()

看看Android的类。如果在活动的
onCreate
方法中创建处理程序,则发送到处理程序的
post
方法的可运行文件将在活动的UI线程上运行:

Handler h;
protected void onCreate(Bundle bundle) {
   h = new Handler;

   new Thread() {
     public void run() {
        // your run code

        h.post(new Runnable() { /* change dialog here */ });
     }
   }.start();

}
我不确定这是不是最好的选择,但值得一试。

在AsyncTask中
您应该在后台做需要时间的工作,并像调用意图一样,在这个任务应该在onPostExecute中完成之后需要做的事情

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) {
         //do more
        publishProgress("Loading something and reached somewhere..");
         //do more
        publishProgress("Loading something and reached somewhere..");
         //do more
        return null;
    }

    protected void onProgressUpdate(String msg) {
        mDialog.setMessage(msg);
    }

    protected void onPostExecute() {
        Intent intent = new Intent(BookmarkActivity.this, ThreadActivity.class);
    BookmarkActivity.this.startActivity(intent);

        mDialog.dismiss();
    }
}
公共类线程预加载程序扩展异步任务{
私人活动能力;
私人住宅;
公共线程预加载程序(活动){
活动性=活动性;
}
受保护的void onPreExecute(){
mDialog=新进度对话框(mActivity);
mDialog.setMessage(“加载…”);
mDialog.show();
}
受保护的Void doInBackground(对象…args){
//多做
publishProgress(“加载某物并到达某处…”);
//多做
publishProgress(“加载某物并到达某处…”);
//多做
返回null;
}
受保护的void onProgressUpdate(字符串msg){
mDialog.setMessage(msg);
}
受保护的void onPostExecute(){
意向意向=新意向(BookmarkActivity.this、ThreadActivity.class);
BookmarkActivity.this.startActivity(intent);
mDialog.discouse();
}
}

嘿,杰森,这听起来很有希望。我将尝试实现这一点,稍后给出反馈!我更新了我的第一篇帖子,实现了你的想法。它没有发挥应有的作用。你能看看代码吗?现在可以了,在AsynTask的实现中有一些小错误。再次感谢。嘿,Matthias,你说得对,我可以使用我现在正在尝试,但是异步任务会更有用。