我有一个活动应该做两个不同的事情并行作为SplashScreen活动:
活动通过处理程序实现初始延迟(task1),通过 AsyncTask
实现文件复制(task2)问题:此活动的延迟应该是两个任务完成然后开始下一个活动的延迟。
我应该注意到这两个任务在后台并行运行,复制文件的时间每次都可能不同(有时长于1.5秒,有些时间更短)。
换句话说,开始下一个活动必须通过完成两个后台任务来同步。
那么,如何实施?
答案 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,当剩余的任务完成时,它将启动活性。