首页 文章

您无法在尚未附加的View或片段上启动加载,其中getActivity()返回null

提问于
浏览
0

我正在使用FragmentStatePagerAdapter来显示一个活动中的大约5个片段 . 在每个活动中,我正在显示我从FirebaseListAdapter / FirebaseRecyclerAdapter获取的图像 . 因为它是FragmentStagePagerAdapter相邻的视图/片段将被初始化,即使它们不可见 . 如果选项卡以快速方式滚动(向前/向后)应用程序崩溃与上述错误 . 我在互联网上发现了一些类似的问题,但没有能够解决这个问题 . 如果我正在开始一项新活动,我也会收到_626384错误(在活动中我在网格视图中显示来自firebase的图像)并立即关闭它(按下后退按钮)我正在使用以下代码 .

adapt= new FirebaseListAdapter<MyClassStudent>(getActivity(), MyClassStudent.class, R.layout.mychild_grid_template, myRef) {
            @Override
            protected void populateView(final View v, MyClassStudent model, int position) {
                final TextView uname = (TextView) v.findViewById(R.id.mychild_uname);

                final CircleImageView profileImage=(CircleImageView)v.findViewById(R.id.mychild_image);
                studRef.child(model.getUsername()).addListenerForSingleValueEvent(new ValueEventListener() {
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        Child child=dataSnapshot.getValue(Child.class);
                        uname.setText(child.getUsername());
                        Glide.with(getActivity()).load(child.getProfileImage()).into(profileImage);
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        };

堆栈跟踪:

E/UncaughtException: java.lang.NullPointerException: You cannot start a load on a not yet attached View or a  Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed).
                         at com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:27)
                         at com.bumptech.glide.Glide.getRetriever(Glide.java:509)
                         at com.bumptech.glide.Glide.with(Glide.java:563)
                         at com.mycompany.educareteacher.FragmentStudents$2$1.onDataChange(FragmentStudents.java:184)
                         at com.google.firebase.database.zzp.onDataChange(Unknown Source)
                         at com.google.android.gms.internal.tl.zza(Unknown Source)
                         at com.google.android.gms.internal.vg.zzHW(Unknown Source)
                         at com.google.android.gms.internal.vm.run(Unknown Source)
                         at android.os.Handler.handleCallback(Handler.java:739)
                         at android.os.Handler.dispatchMessage(Handler.java:95)
                         at android.os.Looper.loop(Looper.java:148)
                         at android.app.ActivityThread.main(ActivityThread.java:5438)
                         at java.lang.reflect.Method.invoke(Native Method)
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)
D/FA: Logging event (FE): app_exception(_ae), Bundle[{firebase_event_origin(_o)=crash, firebase_screen_class(_sc)=ClassDetailActivity, firebase_screen_id(_si)=-4663411025690523798, timestamp=1500710706898, fatal=1}]
V/FA: Recording user engagement, ms: 3544
D/FA: Logging event (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=3544, firebase_screen_class(_sc)=ClassDetailActivity, firebase_screen_id(_si)=-4663411025690523798}]
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.mycompany.com.educareteacher, PID: 5154
                  java.lang.NullPointerException: You cannot start a load on a not yet attached View or a  Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed).
                      at com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:27)
                      at com.bumptech.glide.Glide.getRetriever(Glide.java:509)
                      at com.bumptech.glide.Glide.with(Glide.java:563)
                      at com.mycompany.educareteacher.FragmentStudents$2$1.onDataChange(FragmentStudents.java:184)
                      at com.google.firebase.database.zzp.onDataChange(Unknown Source)
                      at com.google.android.gms.internal.tl.zza(Unknown Source)
                      at com.google.android.gms.internal.vg.zzHW(Unknown Source)
                      at com.google.android.gms.internal.vm.run(Unknown Source)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5438)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)

我该如何解决这个问题?

2 回答

  • 2

    您的片段在响应来自firebase之前已分离,因此在使用之前尝试检查 getActivity() null

    public void onDataChange(DataSnapshot dataSnapshot) {
        if (getActivity() == null) {
            return;
        }
        Child child = dataSnapshot.getValue(Child.class);
        uname.setText(child.getUsername());
        Glide.with(getActivity()).load(child.getProfileImage()).into(profileImage);
    }
    

    您可以在其他地方检查活动是否为空 .

    private Activity mActivity;
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    
        mActivity = getActivity();
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
        mActivity = null;
    }
    
    private void doAction() {
        if (mActivity == null) {
            return;
        }
    
        adapt = new FirebaseListAdapter<MyClassStudent>(mActivity, MyClassStudent.class, R.layout.mychild_grid_template, myRef) {
            @Override
            protected void populateView(final View v, MyClassStudent model, int position) {
                final TextView uname = (TextView) v.findViewById(R.id.mychild_uname);
    
                final CircleImageView profileImage = (CircleImageView) v.findViewById(R.id.mychild_image);
                studRef.child(model.getUsername()).addListenerForSingleValueEvent(new ValueEventListener() {
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (mActivity == null) {
                            return;
                        }
                        Child child = dataSnapshot.getValue(Child.class);
                        uname.setText(child.getUsername());
                        Glide.with(mActivity).load(child.getProfileImage()).into(profileImage);
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
                    }
                });
            }
        };
    }
    
  • 2

    在使用Glide加载图像之前,我更喜欢使用isAdded()片段方法 .

相关问题