android ProgressDialog多线程对话框不';不出现

android ProgressDialog多线程对话框不';不出现,android,multithreading,progressdialog,Android,Multithreading,Progressdialog,我是一个新的安卓程序员,这里有一个我无法解决的问题 我有3门课,MainActivity,Database和ProgressShow 在类数据库中,有一个在资产中复制大型数据库的函数。在ProgressShow中,它用于构建ProgressDialog 但是当我启动程序时,对话框没有显示,但是在大约几秒钟后,它在中断处理程序处停止了。复制大文件时,消息队列似乎阻塞了。但我不知道为什么。这是我的程序,请帮帮我。谢谢 public class MainActivity extends Activit

我是一个新的安卓程序员,这里有一个我无法解决的问题

我有3门课,MainActivity,Database和ProgressShow

在类数据库中,有一个在资产中复制大型数据库的函数。在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();
    }

}
公共类MainActivity扩展活动
{
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
数据库=新数据库(此);
database.CopyBigDatabase(CommonPara.DB\u CONTENT\u NAME,
CommonPara.DB\u内容\u路径+CommonPara.DB\u内容\u名称,
CommonPara.DB_内容_计数);
}
}   
公共类数据库
{
私有上下文;
公共数据库(上下文)
{
mContext=上下文;
}
公共sqlitedatabasedbconnection(字符串文件)
{
SQLiteDatabase db=null;
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
db=SQLiteDatabase.openOrCreateDatabase(文件,null);
}
其他的
{
}       
返回分贝;
}
public void CopyBigDatabase(最终字符串名称、最终字符串目的地、最终整数计数)
{ 
新线程()
{
公开募捐
{   
最终ProgressShow对话框=新建ProgressShow(
McContext,“请稍候”,“等待”,ProgressShow.DIALOG\u类型\u栏,
ProgressShow.DIALOG\u默认值\u最大值);
dialog.ShowDialog();
尝试
{   
输入流为;
OutputStream os=新文件OutputStream(dest);
对于(int i=1;i 0)
{
写操作(缓冲区,0,长度);
}
os.flush();
is.close();
if(dialog.GetProgress()
=GetMax())
{
dialog.cancel();
} 
}
超级handleMessage(msg);
}
};    
public ProgressShow(上下文、字符串标题、,
字符串消息,整数类型,整数最大值)
{  
dialog=新建进度对话框(上下文);
开关(类型)
{
案例0:
setProgressStyle(ProgressDialog.STYLE_微调器);
打破
案例1:
违约:
设置ProgressStyle(ProgressDialog.STYLE_水平);
打破
}
dialog.setMax(max);
对话框。设置标题(标题);
设置消息(消息);
dialog.setUndeterminate(false);
对话框。可设置可取消(false);
对话框。setCanceledOnTouchOutside(false);
dialog.setProgress(-dialog.getProgress());
}    
公共对话框()
{   
handler.sendEmptyMessage(0);
}  
公共空间添加进度(整数增加)
{
handler.sendEmptyMessage(增加);
int a=GetProgress();
}
public int GetProgress()
{
返回dialog.getProgress();
}    
公共对话框()
{
sendEmptyMessage(GetMax());
}
公共int GetMax()
{
return dialog.getMax();
}
}

进程对话框必须显示在主线程中;您正试图从一个单独的线程中显示它),因为处理程序正在创建它的线程中运行


您的流程如下:创建一个新线程,然后在此线程中创建一个新ProgressShow。创建新的ProgressShow对象时,将创建一个新的处理程序对象。此处理程序是在新线程中创建的。无法从主线程以外的线程显示进度对话框。

我建议您使用asynctask复制大数据,并在onPostExecute上显示必要的UI操作。此id不是显示其他线程对话框的好方法。检查AsyncTask类()我发现一个错误。if(dialog.GetProgress()