2012-04-12 3 views
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?

+1

Почему вы это делаете? 't.start()', за которым следует 't.join()', функционально идентичен 't.run()', за исключением потери другого стека потоков и нескольких контекстных переключателей. – EJP

+0

ProgressDialog не отображается, потому что вы используете join(). Итак, если вы хотите показать ProgressDialog, не используйте join(). Почему вы хотите использовать join() прямо после start()? Вы можете просто полностью забыть поток и просто вызвать загружаемый материал. –

+0

Весь смысл потоков заключается в том, что ваша программа может одновременно выполнять две вещи. Если первый поток просто сидит и ждет второго, нет смысла создавать второй поток; просто выполните работу в первом. – Wyzard

ответ

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

выше код может быть решить вашу проблему.

0

join() является вызовом o'death. Если поток блокируется или застревает, вызов join() на нем гарантирует, что застревание эффективно распространяется на вызывающий поток.

Если вам это возможно, не используйте join() вообще. Особенно не используйте его, чтобы ждать результатов из другого потока, вызвав его сразу после start(). Двойной - особенно не используйте его в обработчике событий GUI.

Смежные вопросы