2013-06-25 23 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之外的其他线程显示。