【问题标题】:Android Splash screen with data load and delay带有数据加载和延迟的 Android 启动画面
【发布时间】:2023-03-22 13:48:01
【问题描述】:

我有一个活动应该并行执行 2 个不同的事情作为 SplashScreen 活动:

  1. 等待 1.5 秒以显示应用启动画面
  2. 在后台将一些文件从资产复制到设备存储

Activity 通过 handler 实现初始延迟(task1),通过 AsyncTask

实现文件复制(task2)

问题:这个活动的延迟应该是两个任务完成然后开始下一个活动。 我应该注意,这两个任务在后台并行运行,并且每次复制文件的时间可能不同(有时超过 1.5 秒,有时更短)。

换句话说,启动下一个活动必须通过完成两个后台任务来同步。


那么,如何实现呢?

【问题讨论】:

  • 为什么你不在一个 asyncTask 中完成所有任务,而在 onPostExecute 中完成任务时完成启动屏幕并打开第二个活动

标签: android android-asynctask synchronization handler splash-screen


【解决方案1】:

我认为最简单的做法是在您的异步任务开始时,获取当前时间。完成工作后,再次获取当前时间。如果这小于 1.5 秒,则为差异执行 Thread.Sleep()。

在 postExecute() 中启动下一个活动。像这样的:

private class DoStuffAsync extends AsyncTask<Void, Integer, Long> {
     protected Long doInBackground() {

        long start = new Date().getTime();

        // copy assents

        long end = new Date().getTime();

        if ( end-start < 1500 )
           Thread.sleep( 1500-(end-start));

         return totalSize;
     }

     protected void onPostExecute(Long result) {
         startActivity( new Intent(Activity.this, NewActivity.class));
     }
 }

更新:修正数学问题。

【讨论】:

  • 需要一些小修复
【解决方案2】:

你的设计很扎实。您需要同步处理程序和 AsyncTask 的细节来自于两者都将从 UI 线程执行的实现,因此您无需担心任何并发问题。然后检查是否应该启动新活动的最简单方法是创建两个布尔标志。一个用于 1.5s 计时器,另一个用于文件复制任务。然后当任一进程完成时,它会检查另一个标志是否设置为完成,如果是,则启动一个新的 Activity,否则已完成的任务会将其已完成标志设置为 true,当剩余任务完成时,它将启动活动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多