gpt4 book ai didi

android - 您不能在尚未附加的 View 或 getActivity() 返回 null 的 fragment 上开始加载

转载 作者:太空宇宙 更新时间:2023-11-03 12:03:16 29 4
gpt4 key购买 nike

我正在使用 FragmentStatePagerAdapter 在一个 Activity 中显示大约 5 个 fragment 。在每个 Activity 中,我都显示我从 FirebaseListAdapter/FirebaseRecyclerAdapter 获取的图像。因为它是 FragmentStagePagerAdapter 相邻的 View /fragment 将被初始化,即使它们不可见。如果选项卡以快速方式滚动(向前/向后)应用程序崩溃并出现上述错误。我在互联网上发现了一些类似的问题但没有能够解决这个问题。如果我开始一个新的 Activity (在 Activity 中我在 GridView 中显示来自 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)

我该如何解决这个问题?

最佳答案

你的 fragment 在来自 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);
}

您可以在其他地方检查 Activity 是否为空。

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) {

}
});
}
};
}

关于android - 您不能在尚未附加的 View 或 getActivity() 返回 null 的 fragment 上开始加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45388325/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com