ProgressDialog:如何防止在setButton监听器内自动关闭对话框?

3
我有以下情景: 我在UI线程中显示ProgressDialog,并同时在后台线程中进行网络发现。这很好地工作。对话框有一个“停止”按钮,因此用户可以决定是否要停止发现。
现在我的问题是:为了停止发现,还需要在后台线程中执行一些重量级的工作,以便UI线程中的进度轮不会挂起。理论上,进度轮应该继续旋转,直到后台线程完成其工作。但是,一旦setButton(...)方法到达方法末尾时,它会自动关闭ProgressDialog,而此时线程尚未完成其工作。目前,我无法通过Backgroundthread中的Messagehandler手动解除对话框,因为它被操作系统自动关闭了。

这是我的代码的一部分:

//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个回答

4

我找到了一个非常好的解决方案来解决这个问题:
1. 从ProgressDialog派生你的类。
2. 重写dismiss()方法,并在那里什么也不做,以防止它自动关闭。
3. 为了手动关闭它,添加一个新方法。
4. 在后台线程结束后,调用这个新方法。

public class MyProgressDialog extends ProgressDialog {
    @Override
    public void dismiss() {
        // do nothing
    }
    public void dismissManually() {
        super.dismiss();
    }
}

0
使用一个Service来控制新后台线程的生成。然后使用ResultReceiverMessenger之一来传递UI更新,例如进度状态(即开始、更新、完成);
您可以将ResultReceiverMessenger作为Parcelable(无需工作)传递到用于启动ServiceIntent中。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接