2012-02-06 6 views
0

Я использую этот код, чтобы отобразить диалоговое окно хода, который работает отлично:Использование progressDialog в android?

dialog = ProgressDialog.show(this, "Please wait", 
"Gathering Information...", true); 
    Thread thread = new Thread() 
    { 
    @Override 
     public void run() { 
     if(Chapter_sync.size()>0){ 
     storemodule(); 

     c.open(); 
     for(int i=0;i<Chapter_sync.size();i++) 
      { 
      downloadPDF(Chapter_sync.get(i)); 
      System.out.println("SYNCED"+i); 
      c.update(Chapter_sync.get(i)); 
      } 
      }dialog.dismiss();       
      } 
     };thread.start(); 

     LinearLayout parentlayout=(LinearLayout)findViewById(R.id.chapterholder); 
     parentlayout.removeAllViews(); 

     setUpViews(); 

     } 
    } 

Вот что я пытаюсь сделать, это открыть диалог прогресса, пока все вычисления выполняются. По мере того как я заканчиваю, я хотел снова настроить все виды. Но setUpViews() вызывается до начала потока. Я не очень разбираюсь в основах потоков. Может ли кто-нибудь помочь мне понять, почему это происходит, и как я могу получить свои собственные результаты?

ответ

2

Проблема в том, что вы не используете обработчики. Просто сделать это,

dialog = ProgressDialog.show(this, "Please wait", 
"Gathering Information...", true); 
    Thread thread = new Thread() 
    { 
    @Override 
     public void run() { 
     if(Chapter_sync.size()>0){ 
     storemodule(); 

     c.open(); 
     for(int i=0;i<Chapter_sync.size();i++) 
      { 
      downloadPDF(Chapter_sync.get(i)); 
      System.out.println("SYNCED"+i); 
      c.update(Chapter_sync.get(i)); 
      } 
      }dialog.dismiss();       
      } 
     handler.sendemptyMessage(0); 
     };thread.start(); 

И в ваших OnCreate() Создание обработчиков,

Handler handler=null; 
handler=new Handler() 
{ 
public void handleMessage(Message msg) 
{ 
progressDialog.cancel(); 
    if(msg.what==0) 
{ 
LinearLayout parentlayout=(LinearLayout)findViewById(R.id.chapterholder); 
     parentlayout.removeAllViews(); 

     setUpViews(); 
}; 

Вы не можете обновить пользовательский интерфейс от фонового потока. Либо вы должны использовать AsyncTask, либо использовать обработчики из фонового потока, чтобы сообщить основному потоку, что фоновое действие было завершено.

+0

Thanx, который сработал! – Navdroid

+0

добро пожаловать всегда ... –

0

Планирование потоков зависит от операционной системы. Поэтому создание вашего потока не гарантирует, что ваш поток будет работать, когда захотите.

Проблема, с которой вы сталкиваетесь, может быть лучше всего обработана с помощью задачи async. Или, если у вас есть обратный вызов, который позволяет узнать, когда ваша загрузка будет завершена, вы можете закрыть диалоговое окно обратного вызова. Убедитесь, что вы отключаете его в потоке пользовательского интерфейса.

mActivity.runOnUiThread() или любые другие подобные методы.

0

В вашем коде, если у см

После запуска нити у вас есть вызове метода setUpViews(), который не ждет вашего поток, чтобы закончить и расстановки своих взглядов.

Используйте Handler.post после того, как диалог отклонен в вашей теме, которая собирает вашу информацию.

handler.post(new Runnable() 
{ 
setUpViews(); 
}); 

Итак, после завершения ваших операций ваш setupViews будет вызван вашим обработчиком.