我正在为我的应用程序制作启动画面,我只是测试将主要线程置于睡眠而不是使用计时器。我的代码是:
package com.example.somu.activityswitcher;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class LauncherActivity extends AppCompatActivity {
public void firstActivity() {
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launcher);
TextView countDown = findViewById(R.id.count);
for (int cd=3;cd>0;cd--) {
try {
Thread.sleep(1000);
countDown.setText(Integer.toString(cd));
} catch (Exception e) {
e.printStackTrace();
}
}
firstActivity();
}
}
当MainActivity在3秒后加载时,启动画面(LauncherActivity)只是一个空白屏幕!这是怎么回事?!
activity_launcher.xml :
<?xml version="1.0" encoding="utf-8"?>
<android.widget.RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.somu.activityswitcher.LauncherActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:scaleType="fitCenter"
android:scaleX="0.25"
android:scaleY="0.25"
app:srcCompat="@drawable/logo" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/count"
android:layout_centerHorizontal="true"
android:text="Switching in..." />
<TextView
android:id="@+id/count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="70dp"
android:text="3"
android:textColor="@android:color/black"
android:textSize="50sp" />
</android.widget.RelativeLayout>
我该如何解决这个问题?!
注意:我对以任何方式解决此问题并不感到困扰..我想知道为什么这个方法不起作用,下一步是什么没有明确使用计时器的最佳方法。
答案 0 :(得分:1)
试试这个, 这可能对你有用。
public class LauncherActivity extends AppCompatActivity {
private TextView countDown;
int cd;
public void firstActivity() {
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
countDown = (TextView) findViewById(R.id.count);
try {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
for (cd = 3; cd > 0; cd--) {
countDown.setText(Integer.toString(cd));
}
firstActivity();
}
}, 3000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果你想添加倒计时而不是把它放在处理程序中,
new CountDownTimer(3000, 1000) {
public void onTick(long millisUntilFinished) {
countDown.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
countDown.setText("done!");
firstActivity();
}
}.start();
答案 1 :(得分:0)
您正在主线程中使用Thread.sleep(1000);
来冻结您的用户界面。
由于UI线程被冻结,与此同时,活动将无法充气和渲染,导致仅出现空白屏幕。
但是,您可以在后台线程中使用Thread.sleep
,但无法直接从后台线程更新UI。如果您将倒计时代码放在runOnUiThread
Thread
从后台线程更新UI
new Thread(new Runnable(){
public void run(){
//countdown code.
runOnUiThread(new Runnable(){
public void run(){
textView.setText(...
}
});
}
}).start()
答案 2 :(得分:0)
Thread.sleep(1000);
冻结您的UI
。
试试这个
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
timer = new Timer();
timer.scheduleAtFixedRate(new RemindTask(), 3000, 1000); // delay*/
}
private class RemindTask extends TimerTask {
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
i++;
Log.e("title", "" + i);
tv.setText(i + "");
if (i == 3) {
timer.cancel();
firstActivity();
}
}
});
}
}
答案 3 :(得分:0)
尝试使用此代替Thread.sleep(1000);
new CountDownTimer(3000, 1000) {
@Override
public void onTick(long l) {
countDown.setText(Integer.toString(l/1000));
}
@Override
public void onFinish() {
firstActivity();
finish();
}
}.start();
答案 4 :(得分:0)
尝试使用CountDownTimer来显示计时器而不是Thread或Handler,如下所示:
onTick()
在UI线程上运行,因此您可以在尝试在countDown TextView
上显示(3,2,1)时更新此方法中的UI。
onFinish
被调用,因此当您尝试显示另一个活动时,您可以在计时器完成后在此处编写代码。
new CountDownTimer(3000, 1000) {
public void onTick(long millisUntilFinished) {
countDown.setText(""+ (millisUntilFinished / 1000));
}
public void onFinish() {
firstActivity();
}
}.start();
答案 5 :(得分:0)
try this code.
Intent intent = new Intent(this, WelcomeActivity.class);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
try{
startActivity(intent);
finish();
}
catch (Exception e){
}
}
}, 1000);