我正在尝试在从API加载一些数据时显示ProgressDialog。我将APIPost放入一个线程中,出于调试目的,我一直在让线程休眠3秒钟,试图让对话框出现。但是,当我启动线程时,没有对话框出现,UI线程只是挂起。我错过了什么吗?
final ProgressDialog dialog;
dialog = new ProgressDialog(MyClassName.this);
dialog.setTitle("");
dialog.setMessage("Loading...");
dialog.setCancelable(false);
Thread runner = new Thread(){
JSONObject jTemp;
@Override
public void run(){
try {
synchronized(this){
wait(3000);
}
getFarmProperties.postAPI(tempAddress);
do {
jTemp = getFarmProperties.getJSON();
} while (jTemp == null);
}
catch(InterruptedException ex){
}
}
};
try {
runner.start();
dialog.show();
runner.join();
dialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
答案 0 :(得分:0)
runner.join阻止UI线程,直到跑步者最终完成。正如建议的那样使用AsyncTask。
答案 1 :(得分:0)
runner.start();
dialog.show();
runner.join();
dialog.dismiss();
这实际上启动了线程,发布了一个显示进度对话框的请求,等待线程完成然后关闭进度对话框。
由于仅在UI线程有机会处理消息队列时绘制了进度对话框,因此它从未被绘制过。
使用AsyncTask
并关闭onPostExecute()
中的对话框或删除join()
并在后台线程使用runOnUIThread()
时关闭进度对话框。我建议使用AsyncTask
,因为它为您完成了所有管理,包括方便的回调方法。