启动器 activity 显示为空白屏幕

Launcher activity shows up as blank screen

我正在为我的应用程序制作启动画面,我只是在测试让主线程休眠而不是使用计时器。我的代码是:

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>

我该如何解决这个问题?!

注意:我不介意任何方式来解决这个问题..我想知道为什么这个方法不会'不工作,如果不显式使用计时器,下一个最好的方法是什么。

您正在主线程中使用 Thread.sleep(1000);,这正在冻结您的 UI。

由于UI线程被冻结,与此同时,activity将无法膨胀和渲染,导致只有空白屏幕。

但是,您可以在后台线程中使用 Thread.sleep,但不能直接从后台线程更新 UI。如果将倒计时代码放在 Thread

中,则可以使用 runOnUiThread 从后台线程更新 UI
new Thread(new Runnable(){
    public void run(){
        //countdown code.
        runOnUiThread(new Runnable(){
            public void run(){
                textView.setText(...
            }
        });
    }
}).start()

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();
                    }

                }
            });

        }
    } 

试试这个而不是 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();

尝试使用 CountDownTimer 来显示计时器而不是 Thread 或 Handler,如下所示:

onTick() 运行 在 UI 线程上,因此您可以在尝试在倒计时 [= 上显示 (3,2,1) 时在此方法中更新 UI 12=].

onFinish 在给定计时器完成时调用,因此您可以在计时器完成后在此处编写代码,同时尝试显示另一个 activity.

new CountDownTimer(3000, 1000) {

     public void onTick(long millisUntilFinished) {
         countDown.setText(""+ (millisUntilFinished / 1000));
     }

     public void onFinish() {
         firstActivity();
     }
  }.start();

试试这个, 也许这对你有用。

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();
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);