我正在following this tutorial制作一个闪屏。
在这里,海报提到了两种创建闪屏的方法。
方法1:创建thread
并在重定向到主应用屏幕后将时间设置为sleep
。
Thread background = new Thread() {
public void run() {
try {
// Thread will sleep for 5 seconds
sleep(5*1000);
// After 5 seconds redirect to another intent
Intent i=new Intent(getBaseContext(),FirstScreen.class);
startActivity(i);
//Remove activity
finish();
} catch (Exception e) {
}
}
};
// start thread
background.start();
方法2:将时间设置为handler
并调用Handler().postDelayed
,它会在设置时间后调用runnable
的运行方法并重定向到主应用。< / p>
new Handler().postDelayed(new Runnable() {
// Using handler with postDelayed called runnable run method
@Override
public void run() {
Intent i = new Intent(MainSplashScreen.this, FirstScreen.class);
startActivity(i);
// close this activity
finish();
}
}, 5*1000);
我搜索过邻居无法找到这两种方法之间的区别。
任何人都可以说我在使用资源和内存的情况下首选哪种方式?
答案 0 :(得分:2)
您是否需要使用启动画面来显示徽标,或者您是否真的需要做一些工作?
如果您没有任何实际处理过的内容,Google强烈建议您只加载第一项活动。
如果你必须做一些初始化时间,请使用AsyncTask,如下所示:
public class SplashActivity extends Activity {
private final static int SHOW_TIME = 1300;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
new LoadTask().executeOnThreadPool();
}
class LoadTask extends AsyncTask<Void, Void, Void> {
@Override
protected Boolean doInBackground(Void... params) {
long startTime = System.currentTimeMillis();
// Do the work you need (download resources, etc...)
// Stay on screen for the minimum SHOW_TIME, even if we finished before.
long remainingTime = SHOW_TIME - (System.currentTimeMillis() - startTime);
if (remainingTime > 0) {
try {
Thread.sleep(remainingTime);
} catch (InterruptedException e) {
}
}
return true;
}
@Override
protected void onPostExecute(Boolean result) {
// Continue to next activity.
Intent intent = new Intent(this, YOUR_MAIN_ACTIVITY.class);
startActivity(intent);
finish();
}
}
}
答案 1 :(得分:2)
技术上方法2(使用处理程序)是要走的路。方法1在后台线程上调用UI内容,这可能会导致错误的结果。
答案 2 :(得分:0)
现在,我找到了基于this search的正确答案。
postDelayed()
将Runnable
放入处理程序线程的消息队列中。当控件返回到线程Looper
时,处理消息队列。
Thread.sleep()
只是阻止线程。控件不会返回Looper
,也无法处理消息。