Android系统。片段getActivity()有时会返回null

在开发者控制台错误报告中,有时我会看到有NPE问题的报告。我不明白我的代码有什么问题。在模拟器上,我的设备应用程序在没有forcecloses的情况下运行良好,但是当调用getActivity()方法时,一些用户在片段类中获得NullPointerException。

活动

pulic class MyActivity extends FragmentActivity{

    private ViewPager pager; 
    private TitlePageIndicator indicator;
    private TabsAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        pager = (ViewPager) findViewById(R.id.pager);
        indicator = (TitlePageIndicator) findViewById(R.id.indicator);
        adapter = new TabsAdapter(getSupportFragmentManager(), false);

        adapter.addFragment(new FirstFragment());
        adapter.addFragment(new SecondFragment());
        indicator.notifyDataSetChanged();
        adapter.notifyDataSetChanged();

        // push first task
        FirstTask firstTask = new FirstTask(MyActivity.this);
        // set first fragment as listener
        firstTask.setTaskListener((TaskListener) adapter.getItem(0));
        firstTask.execute();
    }

    indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener()  {
        @Override
        public void onPageSelected(int position) {
            Fragment currentFragment = adapter.getItem(position);
            ((Taskable) currentFragment).executeTask();
        }

        @Override
        public void onPageScrolled(int i, float v, int i1) {}

        @Override
        public void onPageScrollStateChanged(int i) {}
    });}

AsyncTask类

public class FirstTask extends AsyncTask{

    private TaskListener taskListener;

    ...

    @Override
    protected void onPostExecute(T result) {
        ... 
        taskListener.onTaskComplete(result);
    }   }


当应用程序从后台恢复时,可能会发生此错误。在这种情况下我应该如何妥善处理这种情况?


喵喔喔
浏览 733回答 3
3回答

白衣染霜花

好的,我知道这个问题实际上已经解决但我决定分享我的解决方案。我为我创建了抽象父类Fragment:public abstract class ABaseFragment extends Fragment{     protected IActivityEnabledListener aeListener;     protected interface IActivityEnabledListener{         void onActivityEnabled(FragmentActivity activity);     }     protected void getAvailableActivity(IActivityEnabledListener listener){         if (getActivity() == null){             aeListener = listener;         } else {             listener.onActivityEnabled(getActivity());         }     }     @Override     public void onAttach(Activity activity) {         super.onAttach(activity);         if (aeListener != null){             aeListener.onActivityEnabled((FragmentActivity) activity);             aeListener = null;         }     }     @Override     public void onAttach(Context context) {         super.onAttach(context);         if (aeListener != null){             aeListener.onActivityEnabled((FragmentActivity) context);             aeListener = null;         }     }}正如你所看到的,我已经添加了一个监听器,所以每当我需要获取Fragments Activity而不是标准时getActivity(),我需要调用 getAvailableActivity(new IActivityEnabledListener() {         @Override         public void onActivityEnabled(FragmentActivity activity) {             // Do manipulations with your activity         }     });

繁花不似锦

最好摆脱这种情况是在onAttach调用时保持活动参考,并在需要的地方使用活动参考,例如@Overridepublic void onAttach(Context context) {     super.onAttach(context);     mContext = context;}@Overridepublic void onDetach() {     super.onDetach();     mContext = null;}编辑,因为onAttach(Activity)已折旧,现在onAttach(Context)正在使用
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android