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()。そんなことしたらダメ。代わりに、次のように、ダウンロードが終了したときに実行したいコードを含む call メソッドをAsyncTask作成します(more/less):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 に答える