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