我的第一个Android项目需要一些帮助。 我想写一个应用程序,它会显示一个带有ImageView的图片几秒钟,我会这样说约4秒钟,之后它会变成第二个显示按钮的活动(仅用于测试)。
我的问题是我的应用程序在我的AVD中启动后跳过图片并立即显示按钮。
我该如何解决?我抬头看了这么久,尝试了很多东西,我希望你们有一个想法:)
感谢您的帮助
这是我的主要活动代码:
package com.example.parkourspots;
public class MainActivity extends Activity {
private ViewTreeObserver vto;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View myLayout = findViewById(R.id.startscreen);
vto = myLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override
public void onGlobalLayout(){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Intent intent = new Intent(MainActivity.this, select_activity_class.class);
startActivity(intent);
}
});
}}
答案 0 :(得分:18)
检查此代码。
package com.example.parkourspots;
public class MainActivity extends Activity {
private static int TIME_OUT = 4000; //Time to launch the another activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View myLayout = findViewById(R.id.startscreen);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent i = new Intent(MainActivity.this, ActivityTwo.class);
startActivity(i);
finish();
}
}, TIME_OUT);
}
});
答案 1 :(得分:1)
您可以尝试:
public class MainActivity extends Activity {
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler.postDelayed(new Runanble() {
@Override
public void run() {
Intent intent = new Intent(MainActivity.this, select_activity_class.class);
startActivity(intent);
}
}, 4000); // 4 seconds
}
}
另外,您可以在AndroidManifest中添加第二个活动声明:android:finishOnTaskLaunch="true"
答案 2 :(得分:0)
1)睡觉500只睡眠0.5秒。所以它无论如何都会快速闪烁
2)睡眠不允许线程回到弯针,因此它会冻结你的UI。这意味着它无论如何都不会更新和绘制。请改用计时器。或者在这里发布消息给处理程序是可以接受的。
答案 3 :(得分:0)
问题是你只能在500毫秒(一秒钟的一半)内睡觉,所以看起来很快就会发生这种情况。在调用OnGlobalLayoutListener之后,您还希望删除它。以下是适合您的方法示例:
final Handler handler = new Handler(); // Create a Handler on the main Thread
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override
public void onGlobalLayout(){
removeOnGlobalLayoutListener(vto, this);
handler.postDelayed(new Runnable(){
public void run(){
Intent intent = new Intent(MainActivity.this, select_activity_class.class);
startActivity(intent);
}
}, 4000); //Post back to the main Thread after 4000 mils (4 seconds)
}
});
@SuppressLint("NewApi")
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if (Build.VERSION.SDK_INT < 16) v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
else v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
答案 4 :(得分:0)
永远不会停止UI线程。 UI线程负责让您的应用程序保持响应。
但这是解决问题的快速替代解决方案。
public class MyActivity extends Activity {
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler.postDelayed(new Runnable() {
public void run() {
doStuff();
}
}, 5000);
}
private void doStuff() {
Intent intent = new Intent(MainActivity.this, select_activity_class.class);
startActivity(intent);
}
}
然后必须在意图开始后5秒。
但我推荐异步任务
答案 5 :(得分:0)
正确和简短的解决方案
建立一个处理程序并给他们一个延迟回调自己:
final Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 1s
}
}, 1000);
请记住1秒= 1000毫秒
使用该公式调整时间。
快乐编码。