Заставка Android во время загрузки MainActivity

Итак, я просто прочитал этот вопрос: Как создать заставку? Но вместо добавления фиксированной задержки (например, в верхнем ответе), я хотел сохранить экран заставки, пока загружается MainActivity (с MapFragment).

    public class SplashScreen extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_splash);

            Thread t = new Thread(new Runnable() {          
                @Override
                public void run() {
                    Intent i = new Intent(SplashScreen.this, MainActivity.class);
                    startActivity(i);
                    synchronized (this) {
                          try {
                            wait(3000);
                            System.out.println("Thread waited for 3 seconds");
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }       
                }
            });
            try {
                t.start();
                t.join();
                finish();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
}

Я добавил строку wait (3000), потому что раньше я заметил, что поток недолго прожил. Однако, если я заставил его ждать дольше, есть только черный экран, который длится дольше. По какой-то причине активность SplashScreen не отображает ImageView. Что мне делать? Спасибо.

Ответ 1

создайте заставку следующим образом:

while(counter < 1300) {
    try {
            Thread.sleep(1000);
        }catch(InterruptedException e) {
            e.printStackTrace();
        }
        counter+=100;
    }

    Intent intent = new Intent(SplashActivity.this, MainActivity.class);
    startActivity(intent);

Надеюсь, что это поможет!

EDIT: Способ anotehr сделать всплеск будет таким:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    public void run() {
         Intent intent = new Intent(getApplicationContext(), YourNextActivity.class);
         startActivity(intent);
    }
},3000); -> the splash will show for 3000 ms, you can reduce this.

Ответ 2

Простой способ сделать это.

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import com.example.tabs.R;

public class Splash extends Activity implements Runnable
{

    Thread mThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.splash);

        mThread = new Thread(this);

        mThread.start();
    }

    @Override
    public void run() 
    {
        try
        {
            Thread.sleep(2000);
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        finally
        {
            startActivity(new Intent(Splash.this, MainActivity.class));

            finish();
        }
    }

}

splash.xml, если вы хотите показать изображение

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/splash" >


</LinearLayout>

Примечание, если вы хотите выполнить некоторую операцию пользовательского интерфейса во всплеске. Затем вам нужно создать обработчик и обновить интерфейс.

Ответ 3

Основной поток не может быть заблокирован в течение длительного времени. Вы должны использовать Handler для запуска другого события, если вы хотите запустить другое событие за 3 секунды. Вы можете использовать sendMessageDelayed. Кроме того, startActivity следует вызывать в основном потоке.