ProgressDialog:如何防止在setButton-Listener中自动解除Dialog?

时间:2011-04-27 08:26:48

标签: android multithreading progressdialog

我有以下情景: 我在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
});

3 个答案:

答案 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来控制新后台线程的产生。然后使用ResultReceiverMessenger传递UI更新,例如进度状态(即开始,更新,完成);

您可以将[{1}}或ResultReceiver作为Messenger(不涉及任何工作)传递到用于启动Parcelable的{​​{1}}。

答案 2 :(得分:0)

一种方法可能是拥有自己的自定义对话框视图,而不是ProgressDialog,您可以在其中控制它何时消失。