1

所以,在我的对话框中,我有一个按钮可以启动 Asynctask 下载器以从我的服务器获取一些文件;这很好用。但是,我想关闭当前的对话框并在单击按钮时显示 ProgressDialog。我将如何解决这个问题?

目前,如果我单击按钮(我的对话框中的一个元素),整个 UI 会在下载器从服务器下载文件时冻结。下载器完成任务后,将显示进度对话框。

我的代码看起来像这样

MainActivity{

    Dialog dialog;
    ProgressDialog progress;

    onCreate(){
        dialog = new Dialog(this);
        progress = new ProgressDialog(this);
        dialog.setContentView(Some View Resource With My Button);
        someMethod();
        dialog.show();
    }

    someMethod(){
        Button button = (Button) dialog.findViewById(resource of button);
        button.setOnClickListener(new OnClickListener(){

            onClick(){
                dialog.dismiss();
                progress.show();
                new DownloaderAsyncTask(progress).execute().get();
            }

                    //go to another activity when download finished

        });
    }

    private class DownloaderAsyncTask extends AsyncTask<Void, Void, Void>{

        ProgressDialog progress;

        DownloaderAsyncTask(ProgressDialog progress){
            this.progress = progress;
        }

        doInBackGround(){
            //Downloading
        }

        onPostExecute(){
            //Kill connection
            this.progress.dismiss();
        }

    }

}

谢谢。如果你们需要任何其他信息,请告诉我。

4

2 回答 2

6
new DownloaderAsyncTask(progress).execute().get();

我真的不知道为什么AsyncTask有这个get()方法——它基本上把异步过程变成了同步的,因为它会阻塞并等待结果。这就是 UI 冻结的原因。

如果您想等待下载器完成然后执行其他操作,这就是onPostExecute(...)目的。

于 2012-09-11T21:03:16.350 回答
2

您的 UI 线程被冻结,因为您调用了get(). 不要那样做。而是启动你的AsyncTask并让你的onPostExecute()调用方法包含你想要在下载结束时执行的代码,像这样(更多/更少):

someMethod() {
        Button button = (Button) dialog.findViewById(resource of button);
        button.setOnClickListener(new OnClickListener(){

            onClick(){
                dialog.dismiss();
                progress.show();
                new DownloaderAsyncTask().execute();
            }
        });

private void downloaderFinished() {
    this.progress.dismiss();
    /// go to next activity.
}

private class DownloaderAsyncTask extends AsyncTask<Void, Void, Void>{

        doInBackGround(){
            //Downloading
        }

        onPostExecute(){
            //Kill connection
            downloaderFinished();
        }
    }

这就是它的async代表方式,嗯,异步,所以调用get()会杀死所有的好处。

于 2012-09-11T21:03:34.040 回答