0
Private static ProgressDialog loading;

public void downloadData(){
    Thread t = new Thread(){
        public void run(){
          //download stuff
        }
        handler.sendEmptyMessage(0);
    };
    t.start();
    try{
        t.join();
    }catch(InterruptedException ignore){}
}

private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        loading.dismiss();
    }
};

使用せずに donloadData を呼び出すとt.join()、ProgressDialog が表示されます。

ただし、 を使用するt.join()と、t スレッドは正しく実行されているように見えますが、表示さProgressDialogれません。

が表示されないのはなぜProgressDialogですか?

t.join()を使用して表示できるように、何を変更すればよいかについての提案はありますProgressDialogか?

4

2 に答える 2

0

join() は死のコールです。スレッドがブロックまたはスタックした場合、そのスレッドで join() を呼び出すと、スタック状態が呼び出し元のスレッドに効率的に拡張されます。

それを回避できる可能性がある場合は、join() をまったく使用しないでください。特に、start() の直後に呼び出して、別のスレッドからの結果を待つために使用しないでください。特にGUIイベントハンドラーでは使用しないでください。

于 2012-04-12T02:03:40.170 に答える
0

メソッドは、作業が終了するまでt.join現在のスレッドをブロックします。t thread

これを試して:

Private static ProgressDialog loading;

public void downloadData(){
    Thread t = new Thread(){
        public void run(){
          //download stuff

         //edit: when finish down load and send dismiss message
         handler.sendEmptyMessage(0);
        }
        //handler.sendEmptyMessage(0);
    };

    //edit: before start make the dialog show
    loading.show();

    t.start();
    //edit: the join method is not necessary
    try{
        t.join();
    }catch(InterruptedException ignore){}
}

private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        loading.dismiss();
    }
};

上記のコードで問題が解決する場合があります。

于 2012-04-12T01:46:11.643 に答える