我正在开发一个连接到网页的应用来获取一些内容。我想展示一个progressdialog,但我认为我做错了。
这是我的代码:
final ProgressDialog myProgressDialog = ProgressDialog.show(WhoisBeyondActivity.this, "Wait...", "Fetching data...", true);
Handler handler=new Handler();
handler.post(new Runnable()
{
public void run()
{
try {
// code to execute
Thread.sleep(2000);
} catch (Exception e) {
}
myProgressDialog.dismiss();
}
});
问题是progressdialog只在我想要的操作结束时显示一秒钟。我认为progressdialog仅在执行dismiss()时执行,因为它出现并且很快消失。就像progressdialog只出现消失...请帮助我!!!我已经阅读了很多教程,我尝试了很多选项,比如THREAD而不是HANDLER,但它对我没用,因为我必须编辑UI。
答案 0 :(得分:2)
这里有一个很好的例子和教程:
http://www.helloandroid.com/tutorials/using-threads-and-progressdialog
这是我第一次在Android中使用线程对话框时使用的,我将它添加为书签。希望它有所帮助。
答案 1 :(得分:1)
您获得所描述行为的原因是post
方法将仅针对runnable
所附加的线程执行传入Handler
。在你的情况下,这是UI线程。
您正在调用ProgressDialog.show()
,这是异步的。一旦方法返回,这实际上不会显示对话框,而是刚刚请求UI显示对话框。然后立即post
一个休眠2秒的线程,该线程被添加到UI队列并阻止UI执行对话show
。然后UI从睡眠中唤醒,显示对话框然后被解除。
您应该在新的Thread
或AsyncTask
中执行任何网络操作。有关更多详细信息,请查看这些链接:
答案 2 :(得分:0)
您不希望每个人使用单独的线程。你真正想要的是AsynTask。这将允许您创建进度对话框并在任务中执行后台处理。编写简单,易于实现。如果您参考该链接,您所需要的实际上与您的问题非常相似。稍微调整一下,它应该对你有用。
答案 3 :(得分:0)
public class HelloActivity extends Activity {
protected static final String TAG = "HelloActivity";
ProgressDialog myProgressDialog;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//
showDialog(1);
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
//update UI here depending on what message is received.
switch(msg.what){
case 0:
myProgressDialog.dismiss();
}
super.handleMessage(msg);
}
};
Thread t = new Thread(){
public void run(){
try {
// code to execute
Thread.sleep(5000);
} catch (Exception e) {
}
handler.sendEmptyMessage(0);//nothing to send
}
};
t.start();
}
@Override
protected Dialog onCreateDialog(int id) {
myProgressDialog = ProgressDialog.show(HelloActivity.this, "Wait...", "Fetching data...", true);
return myProgressDialog;
}
}