在线程上使用join()时不显示进度条

时间:2012-04-12 01:36:57

标签: java android multithreading

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();
    }
};

当我在不使用t.join()的情况下调用donloadData时,它会显示ProgressDialog。

但是,使用t.join()时,t线程似乎正确执行但ProgressDialog未显示。

为什么ProgressDialog没有显示?

有关更改内容的任何建议,以便我可以使用t.join()并显示ProgressDialog

2 个答案:

答案 0 :(得分: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();
    }
};

以上代码可能会解决您的问题。

答案 1 :(得分:0)

join()是一个呼唤死亡。如果一个线程阻塞或卡住,在它上面调用join()可以确保卡住有效地扩展到调用线程。

如果你可以侥幸逃脱,请不要使用join()。特别是不要在start()之后直接调用它来等待来自另一个线程的结果。 Double-特别是不要在GUI事件处理程序中使用它。