Использование progressDialog в Android? - PullRequest
0 голосов
/ 06 февраля 2012

Я использую этот код для отображения диалога прогресса, который работает нормально:

 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 () вызывается до запуска потока.Я не очень хорош в основах потоков. Может ли кто-нибудь помочь мне понять, почему это происходит и как я могу получить свои собственные результаты?

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

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

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 голосов
/ 06 февраля 2012

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

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

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

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

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

0 голосов
/ 06 февраля 2012

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

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

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

...