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

2024-04-30

根据 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在执行自己的代码之前完成。

你的问题

看来你想在里面做点什么onStart从 firebase eventlisteners 中获取数据集后onCreate. I

也许有什么建议?

您可以使用LiveData让你的代码进去onStart知道 firebase 事件监听器已经完成,并且已经准备好您需要使用的数据onStart.

您问的 LiveDATA 是什么?

LiveData 是一个可观察的数据持有者类。与普通的不同 可观察,LiveData 具有生命周期感知能力,这意味着它尊重 其他应用程序组件的生命周期,例如活动、片段或 服务。这种意识确保 LiveData 仅更新应用程序组件 处于活动生命周期状态的观察者。

查看更多here https://developer.android.com/topic/libraries/architecture/livedata

它会是什么样子:

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

    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 android 项目中 onStart() 方法在 onCreate 之前运行? 的相关文章

  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • Spring Security SAML2 使用 G Suite 作为 Idp

    我正在尝试使用 Spring Security 5 3 3 RELEASE 来处理 Spring Boot 应用程序中的 SAML2 身份验证 Spring Boot 应用程序将成为 SP G Suite 将成为 IDP 在我的 Maven
  • 在 AppAuth-Android 中注销

    我有一个用JAVA开发的Android应用程序 对于这个应用程序 我使用的是身份服务器4 https github com IdentityServer IdentityServer4作为我的 STS 一切正常 但我找不到任何注销的实现Ap
  • jar 中的 apklib 有什么优点?

    我正在关注这个问题 https stackoverflow com questions 6059502 whats the difference between apklib and jar files但它并没有完全回答我的问题 jar 中
  • android 中camera.setParameters 失败

    我已将相机功能包含在我的应用程序中 我还在市场上推出了该应用程序 我从一位用户那里收到一条错误消息 称他在打开相机时遇到错误 我已经在 2 1 的设备上测试了该应用程序 我从用户那里得到的错误是使用 Nexus One 它主要运行 2 2
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • 如何在 Spring 属性中进行算术运算?

  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • Android - iphone 风格 tabhost [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • [cocos2d-x]当我尝试在 Windows 10 中运行“python android-build.py -p 19 cpp-tests”时出现错误

    当我尝试运行命令时python android build p cpp tests 我收到如图所示的错误 在此之前 我收到了另一条关于 Android SDK Tools 版本兼容性的错误消息 所以 我只是将 sdk 版本从 26 0 0
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数

随机推荐

  • 在 LibGDX 中保存和检索图像文件

    如何在 LibGDX 中保存和检索图像文件 我想将图像文件保存在 AndroidApplication 类的本地存储中 并在我的 Core 项目中检索它 Libgdx 中的文件处理在libGDX 维基 https github com li
  • 如何获取字段类型的零值

    我有一个包含许多字段的结构 我已经弄清楚如何使用反射提取字段名称 值和标签信息 我还想做的是确定字段的值是否与字段的默认值不同 目前 我有这个 有效 但有点臭 qsMap make map string interface var defa
  • Android WebView无法正确显示网页

    我有这样的简单 WebView 代码 WebView wv WebView findViewById R id webview1 wv loadUrl http en wikipedia org wiki Book 但显示的页面显示维基百科
  • R 在警告后执行某些操作(例如 tryCatch 警告,然后编辑对象)

    我正在运行一堆 logit 模型 其中一些模型具有完美的分离 会返回 glm 警告 这是显示问题的数据集 DT lt iris str DT DT binary lt as numeric DT Petal Width gt 1 DT du
  • 删除不需要的空行 Eclipse 编辑器

    当我在 eclipse 中打开任何文件时 它在所有代码行和空白行之后显示替代空白行 我怎样才能删除它 In eclipse preference setting you can remove all the unwanted blank l
  • 多种语言如何在一个项目中交互?

    我听说有些人在一个项目中使用多种语言进行编程 我无法想象这些语言如何相互作用 我的意思是没有像这样的Java方法 myProgram callCfunction parameters 从来没有发生过还是我错了 在一个项目中使用多种语言实际上
  • 在具有多个 Web 服务器的现有 .NET / SQL Server 堆栈上实施 Lucene

    我想考虑使用 Lucene 为我当前管理的网站提供全文搜索解决方案 该网站完全基于 SQL Server 2008 C NET 4 技术构建 我要索引的数据实际上非常简单 每个记录只有几个字段 并且只有其中一个字段实际上是可搜索的 我不清楚
  • 将自定义信息添加到 CSPROJ 文件

    作为我们开发生命周期的一部分 我们在项目中针对 C 源代码运行了许多流程 这些进程由 GUI 驱动 该 GUI 当前读取 csproj 文件以查找项目中使用的源文件 这很好用 我们现在有一个新要求 即提供一些需要调用 Web 服务的验证过程
  • 在嵌套有序字典 python 中查找给定键的值

    我试图从嵌套的 OrderedDict 中查找给定键的值 关键点 我不知道这个字典会嵌套多深 我正在寻找的键的名称是不变的 它将位于字典中的某个位置 我想返回本例中名为 powerpoint color 的键的值 mydict Ordere
  • Powershell/PowerCLI 循环、超时和退出

    以下是场景 我通过 Powershell PowerCLI VMwares Powershell 模块 远程启动虚拟机 一旦虚拟机启动 我将针对虚拟机运行一系列 cmdlet 目前我有这段代码 Start VM my VM Name run
  • 继续在文件的同一行写入

    我已经使用以下命令打开了要写入的文件 data open input a 使用循环 我想在同一行中向文件写入一些单词 在每次循环迭代之后我想添加一个换行符 while loop for loop do something if some c
  • 如何创建自定义主题并在 Android 应用程序中使用它?

    如何创建自定义主题并在代码中使用它 菜单中如何实现主题选项并申请活动 有一个不错的风格和主题指南 http developer android com guide topics ui themes html在 Android 开发者网站上
  • Nuget:packages.config 中的 属性的用途是什么?

    我将我的 C 项目 已经有一些 nuget 包 从 4 0 升级到 4 5 2 我看到有些
  • 覆盖主干“设置”方法

    我想重写骨干集方法 以便每当我为骨干模型设置一个值时 都会调用在该属性上注册的回调 而无需检查该属性的相同先前值 var model Backbone Model extend defaults prop1 true var view Ba
  • 使用反射检查java中的字段是否为final

    我正在编写一个类 它在某些时候必须拥有它的所有内容Fields 从该类的另一个项目分配 我通过反思做到了 for Field f pg getClass getDeclaredFields f set this f get pg 问题是 这
  • 如何在首选项标头中使用 PreferenceFragmentCompat

    我正在尝试学习在 Xamarin Android 应用程序中构建首选项页面的方法 我发现了很多 PreferenceFragment 的例子 但它被标记为已弃用 我在现阶段很难重写它们 我创建了代表标题的活动 我添加了 IntentFilt
  • iTextSharp 居中对齐文档对象内的对象

    是否有一种快速而简单的方法可以将文档对象中的对象居中对齐 Without执行任何计算逻辑 即 获取页面宽度 获取内容宽度 除以二等 我在 Document 对象内的 Paragraph 对象中有一个 PdfPTable 对象 我想将段落对象
  • 如何在屏幕上锚定 Tkinter 窗口(不可移动窗口)

    我正在尝试在特定位置打开 tkinter 如果它是不可移动的 那就更好了 我搜索文档和其他内容 但没有找到任何相关内容 最好的方法是将顶部或底部固定在一个位置 x y 如果需要 我可以调整窗口大小 def my functions prin
  • 发布版本和 CLI 出现 aurelia-dialog 错误

    我在使用新的 aurelai 版本时遇到问题 我使用以下命令创建了一个新应用程序 au new myApp 我通过 npm 安装了 aurelia dialog 当我导入 aurelia dialog 并尝试使用运行应用程序时 au run
  • 为什么我的 android 项目中 onStart() 方法在 onCreate 之前运行?

    根据 Activity 的生命周期 onCreate 在应用创建时会被调用一次 然后 onStart 方法在整个 Activity 生命周期中可能会被调用多次 然而这并不是发生在我身上的事情 我的 onCreate 方法中有以下代码 mRe