【问题标题】:Launcher activity shows up as blank screen启动器活动显示为空白屏幕
【发布时间】:2017-10-30 11:05:01
【问题描述】:

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

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>

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

注意:我不介意以任何方式来解决这个问题。我想知道为什么这个方法不起作用,下一步是什么不明确使用计时器的最佳方法。

【问题讨论】:

  • postDelayed() 和正确的Runnable 替换那个蹩脚的繁忙循环
  • @MarcinOrlowski 当然可以。如果您还没有阅读我的原始问题,请阅读。我不想使用任何计时器,只是想知道为什么这不起作用。不管怎么说,多谢拉。 :)
  • @MarcinOrlowski 哦,我使用该循环的唯一原因是在屏幕上显示倒计时。

标签: android splash-screen


【解决方案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();

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      尝试使用CountDownTimer 来显示计时器而不是线程或处理程序,如下所示:

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

      【讨论】:

        【解决方案4】:

        您在主线程中使用 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()
        

        【讨论】:

          【解决方案5】:
          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);
          

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • 处理屏幕上的代码以显示基本倒计时的代码在哪里?这就是我首先编写循环的全部原因!在回答之前至少阅读我的代码并理解我的要求?!
            • @SomenathSinha 得到了解决方案检查更新及其在我的设备中的工作正常
            • 没有。投票后 15 分钟锁定投票,以防你不知道。 :)
            • @SomenathSinha 你试过上面的代码吗?我已经测试过了,它工作正常
            猜你喜欢
            • 1970-01-01
            • 2021-11-01
            • 1970-01-01
            • 2018-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多