gpt4 book ai didi

java - 为什么我的 android 项目中 onStart() 方法在 onCreate 之前运行?

转载 作者:行者123 更新时间:2023-12-01 07:00:23 26 4
gpt4 key购买 nike

根据 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

我还有其他代码,但我将其全部删除,因为我不断收到空指针异常并且无法弄清楚原因。结果我试图从 onStart 方法内部访问“loadedGigs”数组列表,认为它已经从 onCreate 方法填充了。

对于为什么会发生这种情况有什么想法吗?我最好的猜测是这与我使用 Firebase 和子事件监听器有关。我缺乏相当多的知识,我想这就是我无法弄清楚的原因。

提前谢谢,弗拉德

最佳答案

事实核查

事实是,首先调用 onCreate(),然后调用 onStart()。但是,由于您正在进行 Firebase 调用来获取数据集,因此您的 onStart() 不会等待此操作完成,这意味着您的 onStart 内的列表仍未填充。请记住,当调用 onCreate 时,无论执行什么代码,它都不会暂停 onStart 的调用。同样,onStart 不会等待 onCreate 中的所有代码完成后再执行它自己的代码。

您的问题

在从 onCreate 内的 firebase 事件监听器获取数据集后,您似乎想在 onStart 内执行某些操作。我

也许有建议?

您可以使用LiveDataonStart中的代码知道firebase事件监听器已完成,并准备好您需要在onStart<中使用的数据.

您问的 LIVEDATA 是什么?

LiveData is an observable data holder class. Unlike a regular observable, LiveData is lifecycle-aware, meaning it respects the lifecycle of other app components, such as activities, fragments, or services. This awareness ensures LiveData only updates app component observers that are in an active lifecycle state.

查看更多here

它会是什么样子:

//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.");
});

}

关于java - 为什么我的 android 项目中 onStart() 方法在 onCreate 之前运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58899219/

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