【问题标题】:How to perform an action after Activity is started and displayedActivity启动并显示后如何执行动作
【发布时间】:2019-04-08 12:17:33
【问题描述】:

我有两个活动。 ABA 开始 B

B.onCreate()我调用一个函数来下载我在那个活动中需要的文件:DownloadFile()

为此,B 有一个进度条,我会在下载完成后立即隐藏。

我所期望的是以下进展:

  • A 致电startActivity()
  • B 显示
    • B 显示 progressbar
    • B 致电onCreate
    • B.DownloadFile() 被称为
    • B 隐藏progressBar

但实际发生的是:

  • A 致电 startActivity()
    • 屏幕卡在A
    • B 致电onCreate
    • B.DownloadFile() 被调用
    • B 从不显示 progressBar
  • 显示B,文件已下载,立即隐藏进度条。

现在,当我在相同的进程中执行相同的操作但不是下载文件,而是流式传输它时,一切正常。但这可能与MediaPlayer 处理事情的方式有关。

我尝试将onCreate 切换为onStartonResume,从我在this answer 上看到的内容。但同样的事情也会发生。

我想切换活动,只有之后 B 显示,我想开始下载,但我不知道如何。

编辑

根据要求,B的代码

package com.skillcademy360.lite.activities

import android.os.Bundle
import android.support.v7.app.AppCompatActivity

class DownloadActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        DownloadFile()
    }

    fun DownloadFile() {
    }
}

正如我所说,我已经尝试将onCreate 切换为onStartonResume 甚至onPostCreate,无论如何都不应该使用它们。但它们都不起作用。

编辑:

我意识到有一些方法可以解决这个问题,但我需要一种直接的方法。所有这些都与继承和库相关联,因此无法执行“将文件保存为全局变量”之类的操作。

我上面提供的代码的行为方式与我的相同,因此我需要完全解决此问题,而无需使用 AsyncTasks 或全局变量的解决方法。

编辑: 澄清。我明白了,当我在onCreate 中调用它时,DownloadFile() 会阻止 UI。但是,如下所示,当我在onResume 中调用它时,也会发生同样的事情。据我了解,正如它在the lifecycle 中所写,可见生命周期 应该在onStart 之后开始,但它似乎没有这样做。

package com.skillcademy360.lite.activities

import android.os.Bundle
import android.support.v7.app.AppCompatActivity

class DownloadActivity: AppCompatActivity() {
    override fun onResume(savedInstanceState: Bundle?) {
        super.onResume(savedInstanceState)
        DownloadFile()
    }

    fun DownloadFile() {
    }
}

【问题讨论】:

  • 能否提供B活动的创建代码
  • 请分享您的代码,我认为,您在 oncreate() 中调用 DownloadFile,您是否将 DownloadFile() 位置从 onCreate() 更改为 onStart()?
  • 给我们看一些代码,我们猜不出来。
  • 或者您是否将 DownloadFile() 方法位置从 onCreate() 更改为 onResume()?
  • 我已经添加了代码,但它非常简单,所以我不知道这是否有帮助。

标签: android android-activity oncreate


【解决方案1】:

根据Activity Lifecycle

onStart() 在活动对用户可见时调用。 如果活动进入前台,则为onResume(),如果活动被隐藏,则为 onStop()。

您可以尝试在 B Activity onCreate() 中调用您的 DownloadFile() 方法创建背景 Thread(因此下载无法阻止 UI)并开始在 onResume()onStart() 中显示您的 ProgressBar .

编辑:看看this post

编辑 2:如果您不想使用全局变量,那么您可以在 onCreate() 中调用您的 DownloadFile() 方法,显示 ProgressBar,然后执行所有操作 @987654334 @包括解雇ProgressBar

编辑 3:当您在同一 Thread 下载文件时,您可能无法显示动画 ProgressBar,因为您的下载会阻塞整个 UI。

编辑 4

  • 接下来是你行动的真正进展:

    A 呼叫startActivity()

    • 在B 中调用onCreate() 方法

    ProgressBar 设置在 onCreate() 中,但只会显示在 onResume()

    • 方法 DownloadFile() 启动并阻止了整个 UI

    • 方法 onStart()onResume() 没有被调用,因为 DownloadFile() 正在执行中。这就是为什么你卡在屏幕上的原因 Activity A

    DownloadFile() 已完成,方法 onStart()onResume() 被调用。 ProgressBar 已被解雇。

【讨论】:

  • 我在 onPostCreate 方法中使用我下载的文件,所以它不能真正做到异步。或者至少它会产生很大的开销。正如你所建议的,在“onStart”它应该已经可见,所以我想这样做。
  • 只需创建文件object的全局变量。在后台下载它Thread 并在onSuccessDownload() 的某个地方初始化这个变量。然后在onCreate() 之后使用这个objectfluent
  • 我也更新了我的答案,看看那个帖子。
  • 我仍然考虑所有这些workarounds 但这不是活动应该如何工作的,是吗?我的意思是,我本可以想出如何使用 AsyncTask 来做到这一点,但我已经有了很多,正如你自己所说,onStartonResume 应该在 活动之后被调用可见的。我想直接解决这个问题。我想了解为什么会这样。
  • thats not how the activity supposoed to work 下是什么意思?您对startActivity() 之后的后续进展的期望是错误的。 Activity 的行为应有尽有。您不能在 onCreate 中显示 ProgressBar。您可以在那里设置它,但它会显示在onResume 中。调用 DownloadFile 会阻塞你的整个 UI,这就是为什么你一直停留在前一个屏幕直到加载完成。
【解决方案2】:

您可以做的是在活动 A 中创建进度条,这样您就可以确定在您的意图启动时调用它。 在 B 中下载文件,然后只取消它。

如果它仍然不能像这样工作,你能显示一些代码吗? 如果使用调试模式会发生什么?

【讨论】:

    【解决方案3】:

    您可以尝试使用 AsyncTask,在 onPreExecute() 方法中显示您的进度条,在 doInBackground() 中下载您的文件并在 onPostExecute() 中隐藏进度条,

    您可以从 Activity B 的 onCreate() 方法执行此 AsyncTask。

    希望这会有所帮助。

    Ankit Dubey

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多