2013-03-05 64 views
2

我想在进程运行时显示进度对话框,然后在完成该进程后关闭。但是该过程完成之前对话框会冻结。我需要在我的代码中添加什么?进程对话框冻结在进程中间

这里是我的代码:

final ProgressDialog dialog = ProgressDialog.show(this, "","Loading..Wait.." , true); 
     switch (th.getCurrentTab()) { 
     case 0: 
      dialog.show(); 
      Handler menHanlder = new Handler(); 
      menHanlder.postDelayed(new Runnable() { 
       public void run() { 
        for(int i = 0; i < menLV.getCount(); i++) 
        { 
         if(menBooleanArray.get(i) == true) 
         { 
          selectedFromMenList.add(menLV.getItemAtPosition(i).toString()); 
         } 
        } 
        handler.setItemListData(WardrobeActivity.this, "Wardrobe", selectedFromMenList, "Name" , "Men" , "Type"); 
        displayView(); 
        drawer.closeMenu(); 
        refreshTabWidget(); 
        selectedFromMenList.clear(); 
        dialog.dismiss(); 
       } 
      }, 3000); 
      break; 

请问我在使用对话框的方法是坏?

如有任何意见,将不胜感激。

回答

9

你的进度条之间,因为你是在UI线程处理任务重,并在Android中你不应该处理对UI线程的繁重任务,而不是您可以使用AsyncTask用于此目的如下冻结:

public class MyTask extends AsyncTask<Void, Integer, Void>{ 


@Override 
     protected void onPreExecute() { 
//Show progress Dialog here 

     } 


@Override 
     protected void onPostExecute(Voidresult) { 
      //Update UI here if needed 
//Dismiss Progress Dialog here 
     } 

@Override 
     protected String doInBackground(Void... params) { 
      //Do you heavy task here 

     }  

} 

的AsyncTask经过4步骤

onPreExecute()调用执行任务后,立即在UI线程。

doInBackground(Param ...)onPreExecute()完成执行后立即在后台线程上调用。

onProgressUpdate(Progress...)在调用publishProgress(Progress...)后在UI线程上调用。

onPostExecute(Result)后台计算完成后在UI线程上调用。

并开始AsyncTask如下:

new MyTask().execute(); 
+0

给我一个新的方法。谢谢,但我如何实现它?它会是一个内部类还是一个单独的类?和我的进度对话框是点击,所以你的意思是我把我的听众进入内部类? – user1708134 2013-03-05 03:45:18

+0

看到这对你来说是一种新技术,所以你把它作为一个内部类,以后你可以学会把它作为一个单独的类也 – 2013-03-05 03:48:57

+0

我看到,一个按钮将触发进度条,我会依赖于当前选择了什么tabhost,因此我将onClickBackground方法中的onClick监听器放在那里?我认为这将是复杂的,如果我这样做.. – user1708134 2013-03-05 03:53:28

0

这是我实现

在的AsyncTask onPreExecute()我显示进度对话框这样

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog = new ProgressDialog(ContentActivity.this); 
     progressDialog.getWindow().clearFlags(
       WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
     progressDialog.setMessage("Loading..."); 
     progressDialog.setCanceledOnTouchOutside(false); 
     progressDialog.show(); 

    } 

比它onPostExecute( )在doInBackground中的任务完成时调用。我忽略这样的进度对话框

@Override 
    protected void onPostExecute(BlognoneContent result) { 

     super.onPostExecute(result); 
     .............. 
      if (progressDialog.isShowing()) { 
       progressDialog.dismiss(); 
      } 
      ............. 

}