代码之家  ›  专栏  ›  技术社区  ›  Somenath Sinha

启动器活动显示为空白屏幕

  •  -4
  • Somenath Sinha  · 技术社区  · 7 年前

    我正在为我的应用程序制作一个启动屏幕,我只是测试将主线程置于睡眠状态,而不是使用计时器。我的代码是:

    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_启动器。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>
    

    注: 我不担心 无论如何 要解决此问题。。我想知道为什么这个方法不起作用,如果不明确使用计时器,下一个最好的方法是什么。

    6 回复  |  直到 7 年前
        1
  •  1
  •   Jinal Awaiya    7 年前

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

    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
  •  0
  •   Kiran Benny Joseph    7 年前

    试试这个,而不是 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
  •  0
  •   Hareshkumar Chhelana    7 年前

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

    onTick() 在UI线程上运行,以便在倒计时时尝试显示(3,2,1)时可以使用此方法更新UI TextView .

    onFinish

    new CountDownTimer(3000, 1000) {
    
         public void onTick(long millisUntilFinished) {
             countDown.setText(""+ (millisUntilFinished / 1000));
         }
    
         public void onFinish() {
             firstActivity();
         }
      }.start();
    
        4
  •  0
  •   Nabin Bhandari    7 年前

    Thread.sleep(1000); 在冻结用户界面的主线程中。

    同时,由于UI线程被冻结,活动将无法膨胀和渲染,从而导致一个空白屏幕。

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

    new Thread(new Runnable(){
        public void run(){
            //countdown code.
            runOnUiThread(new Runnable(){
                public void run(){
                    textView.setText(...
                }
            });
        }
    }).start()
    
        5
  •  0
  •   Amida    7 年前
    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
  •  0
  •   AskNilesh    7 年前

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