具有数据加载和延迟的Android Splash屏幕

时间:2014-01-17 19:19:50

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

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

  1. 等待1.5秒以显示应用程序启动画面
  2. 将一些文件从资产复制到后台的设备存储
  3. 活动通过处理程序实现初始延迟(task1),通过 AsyncTask

    实现文件复制(task2)

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

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

    那么,如何实施?

2 个答案:

答案 0 :(得分:3)

我认为最简单的事情是在异步任务开始时,获取当前时间。完成工作后,再次获取当前时间。如果这小于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));
     }
 }

更新:修正了数学问题。

答案 1 :(得分:1)

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