2013-06-25 22 views
0

我是一個新的android程序員,這是我的問題,我無法解決它。android ProgressDialog多線程對話框不出現

我有3個類,MainActivity,Database和ProgressShow。

在類Database中,有一個函數用於複製資產中的大數據庫。在ProgressShow中,它用於構建ProgressDialog。

但是當我啓動程序時,對話框沒有顯示,但是它在大約幾秒鐘之後停在處理程序的中斷處。當複製大文件時,似乎消息隊列已被刪除。但我不知道爲什麼。這是我的程序,請幫助我。謝謝。

public class MainActivity extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);   

     Database database = new Database(this); 
     database.CopyBigDatabase(CommonPara.DB_CONTENT_NAME, 
        CommonPara.DB_CONTENT_PATH + CommonPara.DB_CONTENT_NAME, 
        CommonPara.DB_CONTENT_COUNT); 
    } 
} 



public class Database 
{ 
    private Context mContext; 

    public Database(Context context) 
    { 
     mContext = context; 
    } 

    public SQLiteDatabase DbConnection(String file) 
    { 
     SQLiteDatabase db = null; 

     if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 
     { 
      db = SQLiteDatabase.openOrCreateDatabase(file, null); 
     } 
     else 
     { 

     }  
     return db; 
    } 

    public void CopyBigDatabase(final String name, final String dest, final int count) 
    { 
     new Thread() 
     { 
      public void run() 
      { 
       final ProgressShow dialog = new ProgressShow(
        mContext, "please wait", "wait", ProgressShow.DIALOG_TYPE_BAR, 
        ProgressShow.DIALOG_DEFAULT_MAX); 
       dialog.ShowDialog(); 

       try 
       { 
        InputStream is; 
        OutputStream os = new FileOutputStream(dest); 

        for (int i = 1; i <= count; i++) 
        { 
         is = mContext.getAssets().open(name + "." + 
          String.format("%03d", i)); 
         byte[] buffer = new byte[1024]; 
         int length; 
         while ((length = is.read(buffer)) > 0) 
         { 
          os.write(buffer, 0, length); 
         } 

         os.flush(); 
         is.close(); 

         if(dialog.GetProgress() 
          < ProgressShow.DIALOG_DEFAULT_MAX -1) 
         { 
          dialog.CloseDialog(); 
         } 
        } 
        os.close(); 
       } 
       catch (Exception e) 
       { 

       } 
       finally 
       { 
        dialog.CloseDialog(); 
       } 
      } 
     }.run();    
    } 
} 



public class ProgressShow 
{ 
    private ProgressDialog dialog = null; 

    public static final int DIALOG_TYPE_SPINNER = 0;  
    public static final int DIALOG_TYPE_BAR = 1;  
    public static final int DIALOG_DEFAULT_MAX = 100; 
    public static final int DIALOG_DEFAULT_INCREASE = 1; 

    @SuppressLint("HandlerLeak") 
    Handler handler = new Handler() 
    { 
     @Override 
     public void handleMessage(Message msg) 
     {     
      if(msg.what == 0) 
      {     
       dialog.show();     
      } 
      else 
      { 
       dialog.incrementProgressBy(msg.what); 
       if(GetProgress() >= GetMax()) 
       { 
        dialog.cancel(); 
       } 
      } 

      super.handleMessage(msg); 
     } 
    };  


    public ProgressShow(Context context, String title, 
         String message, int type, int max) 
    { 
     dialog = new ProgressDialog(context); 

     switch (type) 
     { 
      case 0: 
       dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);     
       break; 

      case 1: 
      default: 
       dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
       break; 
     } 

     dialog.setMax(max);   
     dialog.setTitle(title); 
     dialog.setMessage(message); 
     dialog.setIndeterminate(false); 
     dialog.setCancelable(false); 
     dialog.setCanceledOnTouchOutside(false); 
     dialog.setProgress(-dialog.getProgress()); 

    }  

    public void ShowDialog() 
    { 
     handler.sendEmptyMessage(0);   
    } 

    public void AddProgress(int increase) 
    { 
     handler.sendEmptyMessage(increase); 
     int a = GetProgress(); 
    } 

    public int GetProgress() 
    { 
     return dialog.getProgress(); 
    }  

    public void CloseDialog() 
    { 
     handler.sendEmptyMessage(GetMax());  
    } 

    public int GetMax() 
    { 
     return dialog.getMax(); 
    } 

} 
+1

我建議你使用asynctask來複制大數據,onPostExecute則顯示必要的UI操作。 – blganesh101

+0

這個ID不是從其他線程顯示對話框的好方法。檢查AsyncTask類(http://developer.android.com/reference/android/os/AsyncTask.html) – JustAnotherCoder

+0

我發現一個錯誤。 if(dialog.GetProgress()

回答

0

ProgressDialog必須顯示在主線程中;您試圖從單獨的線程顯示它),因爲該處理程序正在其創建的線程中運行。

您的流程如下:您創建一個新線程,然後在此線程中創建一個新的ProgressShow。創建新的ProgressShow對象時,您將創建一個新的Handler對象。這個處理程序是在新線程中創建的。進程對話框不能從除main之外的其他線程顯示。