在android中使用progressDialog?

时间:2012-02-06 11:37:55

标签: android progressdialog

我正在使用此代码显示一个正常工作的进度对话框:

 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 个答案:

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

您无法从后台线程更新UI。您必须使用AsyncTask或使用后台线程中的处理程序通知主线程后台操作已完成。

答案 1 :(得分:0)

线程调度取决于操作系统。因此,实例化您的线程并不能确保您的线程可以随时运行。

使用异步任务可以最好地处理您遇到的问题。或者,如果您有一个回调函数可以让您知道下载完成后,则可以关闭回调中的对话框。确保通过执行操作在UI线程中将其关闭。

mActivity.runOnUiThread()或任何其他此类方法。

答案 2 :(得分:0)

在你的代码中,如果你看到

启动线程后,您已经调用了方法setUpViews(),它不会等待您的线程完成并设置您的视图。

在收集信息的线程中关闭对话框后使用Handler.post。

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

因此,在您的操作完成后,您的setupViews将由您的处理程序调用。