0

ProgressDialog を示す静的メソッドを記述し、ワーカーをスレッドで実行し、ワーカーが終了した後に ProgreesDialog を閉じる必要があり、私のメソッドはワーカーが行ったことを返す必要があります。これは私のコードです:

public static TOut execute(最終コンテキスト c、最終文字列タイトル、最終文字列メッセージ、最終 IProgressWorker ワーカー、最終 TIn パラメータ)
{

        最終的な ValueHolder 結果 = 新しい ValueHolder();
        最終的な ProgressDialog の進行状況 = 新しい ProgressDialog(c,R.layout.progress_impl_layout);
        スレッドのメイン = 新しいスレッド (新しい Runnable(){
            @オーバーライド
            public void run() {
                Looper.prepare();//新しい Looper を作成して、progressDialog をすぐに表示します
                最終ルーパー looper=Looper.myLooper();
                AsyncTask async = 新しい AsyncTask(){
                    @オーバーライド
                    protected void onPostExecute(ブール値の結果) {
                        super.onPostExecute(結果);
                        isDone = true;
                        looper.quit();// Looper.loopを終了
                        プログレス.却下();
                    }
                    @オーバーライド
                    保護されたボイド onPreExecute() {
                        super.onPreExecute();
                        progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        progress.setTitle(タイトル);
                        progress.setMessage(メッセージ);
                        プログレス.ショー();
                    }

                    @オーバーライド
                    protected Boolean doInBackground(Integer... params) {
                        IProgressImpl progressImpl=新し​​い MyProgressImpl(進行);
                        worker.execute (progressImpl、param);
                        true を返します。
                    }
                };

                async.execute(0);
                if(!isDone){
                    Looper.loop();//progressDialog をすぐに表示
                }
            }
        });
        main.start();
        試す {
            main.join();
        キャッチ(InterruptedException e){
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        結果を返します。値;
    }

すべてが機能しますが、ProgressDialog は閉じません。looper.quit() が悪いことをしているのではないかと思いますが、Looper.loop() を停止する必要があります。ProgressDialog をすぐに表示する必要があるため、 loop() を呼び出します。

4

2 に答える 2

1

AsyncTask で Android UI を更新する方法

を使用する代わりに、Activity.runOnUiThread()を使用して、やなどのメソッドの UI を更新することをLooperAsyncTask勧めします。ProgressDialogshow()dismiss()

runOnUiThread(new Runnable() {
    @Override
        public void run() {
        progress.dismiss();       
    }
});

Context c上記の がコンテキストである場合Activity、それを使用して にアクセスできますrunOnUiThread()

    c.runOnUiThread()...

メソッドに渡す、または Androidインスタンスを使用Activityするなど、さまざまな方法を使用して、処理クラスで を使用できるようにする必要がある場合があります。execute()Application

それ以外の場合は、通常の を使用できますContextが、上記と同じRunnableことを Thread または Task で実行する必要があります。

于 2013-04-12T17:07:30.973 に答える
0

まず、main変数に格納されているスレッドメイン (別名 UI) スレッドではありません。

に関してはrunOnUIThread()、UI スレッドで作成された Handler を持つことができ、post(Runnable r)postDelayed(Runnable r, long delayMillis)置き換えrunOnUIThread()ます。[または、関数には既に Context パラメーターがあります。アクティビティであることを要求できます。]

また、Android 2 では、UI スレッド以外のスレッドで AsyncTask クラスを初期化するとエラーが発生することに注意してください。

最後に、AsyncTask を使用している場合、別のスレッドが必要なのはなぜですか? または、既にワーカー スレッドがあるのに、なぜ AsyncTask を使用するのでしょうか。あなたは間違いなくそれらの両方を必要としません。

于 2013-04-12T17:28:14.833 に答える