我已经编写了一个函数来创建一个启动画面,我的应用程序超时5秒。
代码工作正常,但是当超时达到零并且我想重定向到我的主要活动时,应用程序崩溃并出现以下错误:
Only the original thread that created a view hierarchy can touch its views.
所以我环顾了一下,有人建议在我的功能中嵌套这个。这似乎是一个好主意,但现在像睡眠/停止这样的方法将无效。
我的代码如下,如果不够清楚,我可以提供更多/详细解释,请告诉我。谢谢你的帮助。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
showSplashScreen();
}
protected boolean _active = true;
protected int _splashTime = 5000; // Splash screen is 5 seconds
public void showSplashScreen() {
setContentView(R.layout.splash_layout);
// Thread splashThread = new Thread() {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
int waited = 0;
while (_active && (waited < _splashTime)) {
Thread.sleep(100);
if (_active) {
waited += 100;
}
}
} catch (InterruptedException e) {
// do nothing
} finally {
showApplication();
}
}
});
}
答案 0 :(得分:7)
可能不是您想听到的内容,但您不应该在您的移动应用上放置启动画面。除了游戏,当人们使用他们想要进入的移动应用程序时,做他们需要做的事情,然后离开。如果你让这个过程需要更长的时间,人们就会对你的应用程序感到沮丧。您可能应该重新考虑不使用启动画面。
答案 1 :(得分:2)
我相信你想要 AsyncTask 。调用完成任务的方法将在UI线程上调用,这使得修改UI元素变得更加容易。
答案 2 :(得分:2)
这将在UI线程上执行sleep。这绝不是一个好主意。
为什么不是这样的?
new Handler().postDelayed(new Runnable() {
public void run() {
// start application ...
}
}, _splashTime);
但是this answer有一个好点。显示启动画面5秒可能非常烦人。
答案 3 :(得分:0)
使用处理程序将事件发布到将删除启动的UI线程。
代码应该像......
splash.show() new Handler().postDelayed( new Runnable() { void run() { splash.remove(); }, delayTime);
答案 4 :(得分:0)
我建议您为spalsh屏幕制作新活动,以常规方式显示(使用startActivityForResult)并在其中放置此类代码(在其中,而不是在您的主要活动中):
new Handler().postDelayed( new Runnable()
{
public void run()
{ finish(); }
}, 5000 );
此外,您还可以处理此新活动点击事件,让用户有机会更快地关闭它,点击它。