Android Firebase数据库IllegalStateException:片段未附加到活动

Android Firebase数据库IllegalStateException:片段未附加到活动,android,android-fragments,firebase,firebase-realtime-database,Android,Android Fragments,Firebase,Firebase Realtime Database,我正在我的应用程序上使用Firebase数据库,有时当数据更改时,应用程序会崩溃: Exception java.lang.IllegalStateException: Fragment Fragmento_Medios_FB{e0076f1} not attached to Activity android.support.v4.app.Fragment.getResources (Fragment.java:646) info.blacktrail.catedralapp.Fragmento

我正在我的应用程序上使用Firebase数据库,有时当数据更改时,应用程序会崩溃:

Exception java.lang.IllegalStateException: Fragment Fragmento_Medios_FB{e0076f1} not attached to Activity
android.support.v4.app.Fragment.getResources (Fragment.java:646)
info.blacktrail.catedralapp.Fragmento_Medios_FB$2.onDataChange (Fragmento_Medios_FB.java:614)
com.google.android.gms.internal.zzbpx.zza ()
com.google.android.gms.internal.zzbqx.zzZT ()
com.google.android.gms.internal.zzbra$1.run ()
android.os.Handler.handleCallback (Handler.java:751)
android.os.Handler.dispatchMessage (Handler.java:95)
android.os.Looper.loop (Looper.java:154)
android.app.ActivityThread.main (ActivityThread.java:6682)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1520)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1410)
我检查了所有的东西,没有什么问题。有什么帮助吗

这是我的片段

public class Fragmento_Medios_FB extends Fragment {

    public Fragmento_Medios_FB() {
    }
    FragmentManager mFragmentManager;
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
    LinearLayout somelayout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_medios_fb, container, false);
        somelayout=(LinearLayout)view.findviewById.(R.id.somelayout);
        return view;
    }

    @Override
    public void onStart() {
        super.onStart();

        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String someString = dataSnapshot.child("medios").getValue
                int Idsomeid = getResources().getIdentifier(edo_medios_sector_sur_01S, "drawable", getActivity().getPackageName());
                somelayout.setBackgroundResource(Idsomeid);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }
}

drawable正常且已检查,并且数据库项、崩溃有时会发生,但并非每次数据库更改时都会发生,它们的解决方案非常巧妙:

Activity activity = getActivity(); 
if(activity != null && isAdded()) {
   int Idsomeid = getResources().getIdentifier(edo_medios_sector_sur_01S, "drawable", getActivity().getPackageName());
}
这显然是因为当数据来自Firebase时,您的片段已创建,但尚未附加到活动


许多情况下都会返回此异常,例如和

它们的解决方案非常巧妙:

Activity activity = getActivity(); 
if(activity != null && isAdded()) {
   int Idsomeid = getResources().getIdentifier(edo_medios_sector_sur_01S, "drawable", getActivity().getPackageName());
}
这显然是因为当数据来自Firebase时,您的片段已创建,但尚未附加到活动


许多情况下会返回此异常,例如和

,因为异常表示“Fragmento_Medios_FB未附加到活动”,这意味着当您的数据更改时,并通过“addValueEventListener”通知您Fragmento_Medios_FB未附加。为了防止崩溃,您必须在生命周期的onStop方法中注销侦听器。

例外情况是“Fragmento\u Medios\u FB未连接到活动”,这意味着当您的数据更改并通过“addValueEventListener”通知您时,Fragmento\u Medios\u FB未连接。为了防止崩溃,您必须在生命周期的onStop方法中注销侦听器。

我将此代码放在哪里?在碎片上?还是在活动中?在创建时?在尝试获取资源()和异步回调时,您应该始终执行检查,我将此代码放在何处?在碎片上?还是在活动中?在创建时?当尝试在中获取资源()和异步回调时,应该始终执行检查此片段上没有onSTop方法added@AgustinScalisi因此,覆盖它并修复您的侦听器。要覆盖方法,只需启动输入ON。。。在片段中,主体块和IDE将帮助您。GeniusQ的解决方案比解决方案更复杂,因为onStart方法在onAttach之后调用得更晚。在这个片段上没有onSTop方法added@AgustinScalisi因此,覆盖它并修复您的侦听器。要覆盖方法,只需启动输入ON。。。在片段中,主体块和IDE将帮助您。GeniusQ的解决方案比解决方案更复杂,因为onStart方法在OnAtach之后调用要晚得多。