我正在使用此代码显示一个正常工作的进度对话框:
dialog = ProgressDialog.show(this, "Please wait",
"Gathering Information...", true);
Thread thread = new Thread()
{
@Override
public void run() {
if(Chapter_sync.size()>0){
storemodule();
c.open();
for(int i=0;i<Chapter_sync.size();i++)
{
downloadPDF(Chapter_sync.get(i));
System.out.println("SYNCED"+i);
c.update(Chapter_sync.get(i));
}
}dialog.dismiss();
}
};thread.start();
LinearLayout parentlayout=(LinearLayout)findViewById(R.id.chapterholder);
parentlayout.removeAllViews();
setUpViews();
}
}
这里我要做的是显示“进度”对话框,直到完成所有计算。 完成后我想再次设置所有视图。但是在线程启动之前调用setUpViews()。我不太擅长线程基础。可以任何人帮助我理解为什么会发生这种情况,我怎样才能得到自己的结果?
答案 0 :(得分:2)
问题是你没有使用处理程序。只需这样做,
dialog = ProgressDialog.show(this, "Please wait",
"Gathering Information...", true);
Thread thread = new Thread()
{
@Override
public void run() {
if(Chapter_sync.size()>0){
storemodule();
c.open();
for(int i=0;i<Chapter_sync.size();i++)
{
downloadPDF(Chapter_sync.get(i));
System.out.println("SYNCED"+i);
c.update(Chapter_sync.get(i));
}
}dialog.dismiss();
}
handler.sendemptyMessage(0);
};thread.start();
在你的onCreate()中创建处理程序,
Handler handler=null;
handler=new Handler()
{
public void handleMessage(Message msg)
{
progressDialog.cancel();
if(msg.what==0)
{
LinearLayout parentlayout=(LinearLayout)findViewById(R.id.chapterholder);
parentlayout.removeAllViews();
setUpViews();
};
您无法从后台线程更新UI。您必须使用AsyncTask或使用后台线程中的处理程序通知主线程后台操作已完成。
答案 1 :(得分:0)
线程调度取决于操作系统。因此,实例化您的线程并不能确保您的线程可以随时运行。
使用异步任务可以最好地处理您遇到的问题。或者,如果您有一个回调函数可以让您知道下载完成后,则可以关闭回调中的对话框。确保通过执行操作在UI线程中将其关闭。
mActivity.runOnUiThread()或任何其他此类方法。
答案 2 :(得分:0)
在你的代码中,如果你看到
启动线程后,您已经调用了方法setUpViews(),它不会等待您的线程完成并设置您的视图。
在收集信息的线程中关闭对话框后使用Handler.post。
handler.post(new Runnable()
{
setUpViews();
});
因此,在您的操作完成后,您的setupViews将由您的处理程序调用。