我有一个关于线程的棘手问题我无法找到答案。问题是我需要制作虚拟应用程序,启动闪屏2秒,然后启动新活动。用户可以通过按向后箭头停止此等待过程,然后应关闭闪屏并且不应打开第二个窗口。
我想到的是AsyncTakk
,其中doInBackround为Thread.sleep(2000)
,而onPostExecute()
新应用程序已打开。另外,我在onPause
中取消了这个asynctask。
所以doInBackground看起来像这样:
protected Boolean doInBackground(Void... voids) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
我认为这是正确的做法。根据{{3}}:
使发送此消息的线程休眠给定的 时间间隔(以毫秒为单位)。精度不是 保证 - 线程可能比所请求的更多或更少地睡眠。
对我来说似乎没问题。
但是,我从检查它的人那里得到了信息,我在那里开始新的线程并且这是一个错误。
我添加了严格的模式检查,没有。检查了eclipse中的线程,我也没有看到任何异常。
所以,我的问题是 - 我是否真的开始新线程,为什么,如果没有,你能提供一些链接,向他展示。
答案 0 :(得分:0)
新帖子不是由sleep()
创建的。可能由AsyncTask.execute()
创建新线程。方法doInBackground()
在'后台'线程中执行,而不是在主线程中执行。 AsyncTask.execute()
不必创建新线程。它可以重用其内部使用的线程池中的现有“后台”线程。
你的解决方案没有错(实际上有些人可能认为它错了,因为它可能会创建一个不必要的线程),但是有一个更好的解决方案。您应该使用Handler.postDelayed(Runnable r, long delayMillis)
。
// call from main thread
Handler handler = new Handler();
handler.postDelayed(r, 2000);
// the runnable r will contain the code that has to execute in 2000 milliseconds