我有以下情景:
我在UI-Thread中显示ProgressDialog,同时在Backgroundthread中执行Networkdiscovery。这很好用。 Dialog有一个 Stop -Button,因此用户可以决定是否要停止发现。
现在我的问题是:要停止发现,在Backgroundthread中也会完成一些繁重的工作负载过程,因此UI-Thread中的Progresswheel不会挂断。理论上,Progresswheel应继续旋转,直到Backgroundthread完成其工作。但是setButton(...)
- 方法一旦到达Methodend就自动解除ProgressDialog,到那时Thread还没有完成它的工作。目前我没有机会通过Backgroundthread中的Messagehandler手动关闭Dialog,因为它自动被操作系统解雇。
这是我的代码的一部分:
//Initialize ProgressDialog
ProgressDialog discoveryProgressDialog;
discoveryProgressDialog = new ProgressDialog(context);
discoveryProgressDialog.setTitle("Discover Network");
discoveryProgressDialog.setCancelable(true);
discoveryProgressDialog.setIndeterminate(false); //setting this to true does not solve the Problem
//add Buttonlistener to Progressdialog
discoveryProgressDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "Stop", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
stopDiscoveryTask(); //starts the Backgroundthread
//something here to wait for Thread-Finishing and not freezing
//the UI-Thread or something to prevent dismissing the
//Dialog automatically
}//<--- End will be reached directly after Backgroundthread has started which triggers automatically the dismiss of the Progress-Dialog
});
答案 0 :(得分:4)
我找到了解决这个问题的一个很好的解决方案:
1.从ProgressDialog中派出你的班级
2.覆盖dismiss()方法,并在那里不做任何事情以防止它自动解除
3.要手动关闭它,请添加新方法
4.后台线程结束后,调用这个新方法。
public class MyProgressDialog extends ProgressDialog {
@Override
public void dismiss() {
// do nothing
}
public void dismissManually() {
super.dismiss();
}
}
答案 1 :(得分:0)
使用Service
来控制新后台线程的产生。然后使用ResultReceiver
或Messenger
传递UI更新,例如进度状态(即开始,更新,完成);
您可以将[{1}}或ResultReceiver
作为Messenger
(不涉及任何工作)传递到用于启动Parcelable
的{{1}}。
答案 2 :(得分:0)
一种方法可能是拥有自己的自定义对话框视图,而不是ProgressDialog,您可以在其中控制它何时消失。