簡體   English   中英

為什么 onStart() 方法在我的 android 項目中的 onCreate 之前運行?

[英]why does onStart() method run before onCreate in my android project?

根據 Activity 生命周期,onCreate() 在應用創建時被調用一次,隨后的 onStart() 方法可能在整個 Activity 生命周期中被多次調用。 然而,這不是發生在我身上的事情。

我的 onCreate 方法中有這段代碼:

mRef.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {


                Gig thisGig =  dataSnapshot.getValue(Gig.class);

                loadedGigs.add(thisGig);
                Log.w("onCreate", "There are " + loadedGigs.size() + "Gigs loaded in the array.");


                arrayAdapter.notifyDataSetChanged();
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

然后我有我的 onStart 方法:

@Override
    protected void onStart()
    {
        super.onStart();
        Log.w("onStart", "There are " + loadedGigs.size() + "Gigs loaded in the array.");


    }

這是日志:

V/FA: onActivityCreated
W/onStart: There are 0Gigs loaded in the array.
V/FA: Activity resumed, time: 2460468116
D/FA: Logging event (FE): screen_view(_vs), Bundle[{ga_event_origin(_o)=auto, ga_previous_class(_pc)=search_gigs_activity, ga_previous_id(_pi)=-5229767692724064313, ga_screen_class(_sc)=search_gigs_results_activity, ga_screen_id(_si)=-5229767692724064312}]
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
W/onCreate: There are 1Gigs loaded in the array.
W/onCreate: There are 2Gigs loaded in the array.
W/onCreate: There are 3Gigs loaded in the array.
V/FA: Inactivity, disconnecting from the service

我有其他代碼,但我將其全部刪除,因為我不斷收到 null 指針異常並且無法弄清楚原因。 結果我試圖從 onStart 方法內部訪問“loadedGigs”數組列表,認為它已經從 onCreate 方法填充。

關於為什么會發生這種情況的任何想法? 我最好的猜測是它與我使用 Firebase 和子事件偵聽器有關。 我缺乏相當多的知識,我認為這就是為什么我無法弄清楚。

提前謝謝,弗拉德

事實核查

事實是,首先調用onCreate() ,然后onStart() 但是因為您正在調用 firebase 來獲取數據集,所以您的onStart()不會等待此操作完成,這意味着您在onStart中的列表仍未填充。 請記住,當調用onCreate時,無論在那里執行什么代碼,它都不會暫停onStart的調用。 同樣, onStart在執行它自己的代碼之前不會等待onCreate中的所有代碼完成。

你的問題

onCreate中的 firebase eventlisteners 獲取數據集后,似乎您想在onStart中做一些事情。

一個建議可能嗎?

您可以使用LiveDataonStart中的代碼知道 firebase 事件監聽器已完成,並准備好您需要在onStart中使用的數據。

你問什么是實時數據?

LiveData 是一個可觀察的數據持有者 class。 與常規的 observable 不同,LiveData 具有生命周期感知能力,這意味着它尊重其他應用程序組件的生命周期,例如活動、片段或服務。 這種意識確保 LiveData 僅更新處於活動生命周期 state 的應用程序組件觀察者。

在這里查看更多

看起來如何:

 //just add dependency into the app/build.gradle. def lifecycle_version = "1.1.1" implementation "android.arch.lifecycle:extensions:$lifecycle_version" annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version" // Create an instance of LiveData to hold your firebase dataset eg List of Gig object private MutableLiveData<List<Gig>> myGigLiveData; ....... //initialize inside onCreate() myGigLiveData = new MutableLiveData<>(); ....... mRef.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) { Gig thisGig = dataSnapshot.getValue(Gig.class); loadedGigs.add(thisGig); Log.w("onCreate", "There are " + loadedGigs.size() + "Gigs loaded in the array."); arrayAdapter.notifyDataSetChanged(); //set the dataset value to livedata myGigLiveData.setValue(loadedGigs); }............... //observe the livedata in onStart like so: @Override protected void onStart() { super.onStart(); myGigLiveData.observe(this, gigsList ->{ Log.w("onStart", "There are " + gigsList.size() + "Gigs loaded in the array."); }); }

在您的活動中 onCreate() 在 onStart() 之前調用,但在您的 onCreate() 方法中您只添加 childEventListener,而onChildAdded事件僅在調用 onStart() 之后發生,這就是您在日志中看到的內容。

您開始在onChildAdded回調中填充您的loadedGigs列表,該回調(在您的情況下)在活動的onStart()調用之后觸發。

根據文檔, ChildEventListener“發生更改時將觸發適當的方法” ,這意味着它將在將來的某個時刻以異步方式發生,因此您不應期望您的數據存在於活動的onStart()中。

還有一件事。 您的Log.w("onCreate",...)與活動的生命周期onCreate(Bundle savedInstanceState) ,這樣的日志 output 消息可能會造成混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM