Android DialogFragment:始终使用进度条执行空指针异常。如何解决?

Android DialogFragment:始终使用进度条执行空指针异常。如何解决?,android,nullpointerexception,android-fragments,android-fragmentactivity,Android,Nullpointerexception,Android Fragments,Android Fragmentactivity,考虑这个对话框片段: public class RollTriggerDialog extends DialogFragment{ private ProgressDialog _dialog; int _progress; public Handler _progressHandler; public RollTriggerDialog() { // empty } @Override public Dialog o

考虑这个对话框片段:

public class RollTriggerDialog extends DialogFragment{

    private ProgressDialog _dialog;
    int _progress;
    public Handler _progressHandler;

    public RollTriggerDialog() {
        // empty
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {
        _dialog = new ProgressDialog(getActivity());

        this.setStyle(STYLE_NO_TITLE, getTheme());
        _dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        _dialog.setProgress(0);

        _progressHandler = new Handler() {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);

                if (_progress >= 100) {
                    _dialog.dismiss();
                } else {
                    _progress++;
                    _dialog.incrementProgressBy(1);
                    _progressHandler.sendEmptyMessageDelayed(0,100);
                }

            }
        };
        //_progressHandler.sendEmptyMessage(0); <- This uncommented would start the progress
        return _dialog;
    }
}
公共类RollTriggerDialog扩展了DialogFragment{
私有进程对话框;
国际进步;
公共处理程序(progressHandler);;
公共RollTriggerDialog(){
//空的
}
@凌驾
公共对话框onCreateDialog(最终捆绑包保存状态){
_dialog=newprogressdialog(getActivity());
this.setStyle(STYLE_NO_TITLE,getTheme());
_设置ProgressStyle(ProgressDialog.STYLE_水平);
_对话框。设置进度(0);
_progressHandler=新处理程序(){
公共无效handleMessage(消息消息消息){
超级handleMessage(msg);
如果(_进度>=100){
_dialog.dismise();
}否则{
_进步++;
_对话框。递增进度(1);
_progressHandler.sendEmptyMessageDelayed(0100);
}
}
};

//_progressHandler.sendEmptyMessage(0);出现
NullPointerException
,因为
findFragmentByTag
返回
null
。解决方案是在使用
findFragmentByTag
方法立即执行该片段事务之前调用
fm.executePendingTransactions()

另外,
处理程序
引用此时将为
null
,因此您需要在片段的生命周期方法之一中初始化它,例如,
onCreate

public static Handler _progressHandler; // should be made static

//...
@Override
public void onCreate(Bundle savedInstanceState) {       
    super.onCreate(savedInstanceState);
    _progressHandler = new Handler() {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (_progress >= 100) {
                _dialog.dismiss();
            } else {
                _progress++;
                _dialog.incrementProgressBy(1);
                _progressHandler.sendEmptyMessageDelayed(0, 100);
            }

        }
    };
}

嗯,这似乎真的很棘手。有趣的是,我没有得到一张赞成票,Hanks Luksprog,今晚我将检查这是如何工作的。现在关于处理程序:你的意思是在OnCreate中初始化它,而不是像我在问题中那样在onCreateDialog中初始化它?作为补充,我认为你的声明将给出一个编译器错误,因为处理程序正在使用g非静态引用,如_dialog@quinestor您必须更早地初始化处理程序引用,因为
活动
onCreate
方法之后将调用
onCreate对话框
(因此在此之前,您将有一个空的处理程序引用)。如果您将使用
处理程序
类的实例作为字段初始化处理程序,那么您需要将其余字段声明为
静态
。但是,当您使用非静态方法初始化处理程序引用时,您几乎可以保证在进入在方法上。我不太确定,所以您需要对它进行测试。是的,Luksprog,就是这样。将初始化移动到onCreate和executePndingTransactions(),我看到我必须阅读更多关于它的内容。+1对所有:)关于静态处理程序,这是另一个问题,我想我会解决的
public static Handler _progressHandler; // should be made static

//...
@Override
public void onCreate(Bundle savedInstanceState) {       
    super.onCreate(savedInstanceState);
    _progressHandler = new Handler() {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (_progress >= 100) {
                _dialog.dismiss();
            } else {
                _progress++;
                _dialog.incrementProgressBy(1);
                _progressHandler.sendEmptyMessageDelayed(0, 100);
            }

        }
    };
}