我有一个启动画面并使用计时器线程显示它2.5秒,这很好但我得到一个空白页面。如果我删除了计时器线程,我的页面会完美显示。
Thread splashTimer = new Thread(){
public void run(){
try{
int splashTimer = 0;
while (splashTimer < 2500){
sleep(200);
splashTimer = splashTimer + 200;
Intent navMainPage = new Intent("com.extempor.cheetah.CLEARSCREEN");
startActivity(navMainPage);
}
}
catch(InterruptedException e){
e.printStackTrace();
}
finally{
finish();
}
}
};
splashTimer.run();
正确显示的页面显示png图像。我尝试了一个textview,但是当我有计时器线程时没有任何效果。我正在使用2.3.3和Eclipse 3.7
似乎计时器线程是显示启动画面的标准方式,但为什么我使用它时没有显示内容?
答案 0 :(得分:1)
首先,你绝对不应该让你的用户等待任何非必要的时间。如果你需要在启动时做一些耗时的工作,那么在此期间显示一个启动画面并使用处理程序回调在工作完成时隐藏它。让你的用户无缘无故地等待2或3秒,这样你就可以向他们展示漂亮的照片,这会让人们无法使用你的应用程序IMO。
我使用fadeOut动画实现了这个效果。
see this question例如动画代码。如果您使用该示例中的代码,您可以使用类似的内容将其延迟2秒
Runnable r = new Runnable(){
public void run(){
introLayout.startAnimation(fadeOutAnim);
introLayout.setVisibility(View.GONE);
}
};
Handler h = new Handler();
h.postDelayed(r, 2000);
再次请真正考虑使用启动只有你有一些真正的工作要做,不要强迫你的用户等待2秒没有充分的理由。
答案 1 :(得分:1)
永远不要在非UI线程中执行与UI相关的任何操作,例如Timer。如果您在执行其他工作时需要显示启动画面,请使用AsyncTask。
AsyncTask有3个主要方法:
OnPreExecute(),在执行异步线程之前在UI线程内执行并触发,你可以在这里做任何事情,比如显示你的启动画面。
DoInBackground()这是在UI线程外部自己的线程中执行的。您无法在此处更新UI,这主要是为了执行您的应用程序所需的任何设置任务,同时用户可以读取启动画面。
OnPostExecute()当DoInBackground()完成并在UI线程中运行时会触发,你可以在这里解除你的启动画面。
阅读here
答案 2 :(得分:0)
我的确建议蒂姆回答。无论如何猜测,你的代码片段中的最后一行都是正确的。
即你打电话时,“SplashTimer.run()”!
使用run()和start()启动线程之间存在差异,您需要了解它。
简短&amp;简单, run():同步启动线程。 start():异步启动线程。
有关更多讨论,您可以浏览this link