为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喔喔 2019-09-19 09:04:53
在开发者控制台错误报告中,有时我会看到有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);     }   }当应用程序从后台恢复时,可能会发生此错误。在这种情况下我应该如何妥善处理这种情况?
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

好的,我知道这个问题实际上已经解决但我决定分享我的解决方案。我为我创建了抽象父类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
        }
    });


查看完整回答
反对 回复 2019-09-19
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

最好摆脱这种情况是在onAttach调用时保持活动参考,并在需要的地方使用活动参考,例如

@Overridepublic void onAttach(Context context) {
    super.onAttach(context);
    mContext = context;}@Overridepublic void onDetach() {
    super.onDetach();
    mContext = null;}

编辑,因为onAttach(Activity)已折旧,现在onAttach(Context)正在使用


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 732 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信