在onPreExecute方法上报告了Android奇怪的错误

时间:2013-09-20 09:45:56

标签: java android exception android-asynctask

今天我的G. Analytics帐户报告了这行代码的错误

private class GetSubscriptionListTask extends AsyncTask<Void, Void, Void> {

    boolean onlyUnread=true;

    public GetSubscriptionListTask(boolean onlyUnread) {
        super();
        this.onlyUnread=onlyUnread;
    }

    ProgressDialog progress;

    @Override
    protected void onPreExecute() {
          //Show progress Dialog here
          super.onPreExecute();

          // create ProgressDialog here ...
          progress = new ProgressDialog(getActivity()); // <-- That's the line
          progress.setMessage("Downloading Subscriptions");
          // set other progressbar attributes

          progress.setCancelable (false);
          progress.setIndeterminate (true);
          progress.show();

    }
}

这是

progress = new ProgressDialog(getActivity()); // <-- That's the line

这是错误报告

NullPointerException (@SubscriptionsListFragment$GetSubscriptionListTask:onPreExecute:415) {main}
这是什么意思? nullexception是关于ProgressDialog还是getActivity()?

* UPDATE * * 此错误仅在100多个会话中发生一次。

3 个答案:

答案 0 :(得分:1)

如果您的班级扩展了getActivity(),则可以使用FragmentActivity。否则,如果您的类扩展了活动

,请尝试yourActivty.this

或者你在Fragment类中调用onAttach

获得Activty引用
Activity mActivity=null
@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = activity;
    }

答案 1 :(得分:1)

有时,Fragments与您的活动分离,getActivity()返回null。

您可以在此处看到:http://developer.android.com/guide/components/fragments.html

  

警告:如果在Fragment中需要Context对象,则可以   调用getActivity()。但是,请注意只调用getActivity()   当片段附加到活动时。当片段不是   尚未附着,或在其生命周期结束时被分离,   getActivity()将返回null。

这就是你在这里获得NPE的原因。

答案 2 :(得分:0)

// try this way
private class GetSubscriptionListTask extends AsyncTask<Void, Void, Void> {

        boolean onlyUnread=true;
        Context context;

        public GetSubscriptionListTask(boolean onlyUnread,Context context) {
            super();
            this.onlyUnread=onlyUnread;
            this.context=context;
        }

        ProgressDialog progress;

        @Override
        protected void onPreExecute() {
            //Show progress Dialog here
            super.onPreExecute();

            // create ProgressDialog here ...
            progress = new ProgressDialog(context); <-- That's the line
            progress.setMessage("Downloading Subscriptions");
            // set other progressbar attributes

            progress.setCancelable (false);
            progress.setIndeterminate (true);
            progress.show();

        }