0

I am working on an app and I want to implement a auto transition effect on the SplashScreen.

I have tried Thread, but the transition is not showing.

However, if I used Handler instead, the transition works fine.

Why it only works on Handler? Can somebody please explain to me?

Handler version

public class SplashScreen extends AppCompatActivity { //Works

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash_screen);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {

            Intent i = new Intent(getApplicationContext(),MainActivity.class);
            startActivity(i);
            overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
            finish();
        }
    }, 5000);
}

Thread version

public class SplashScreen extends AppCompatActivity { //Not Working

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash_screen);
    Thread myThread = new Thread(){
        @Override
        public void run() {
            try {
                sleep(3000);
                Intent i = new Intent(getApplicationContext(),MainActivity.class);
                startActivity(i);
                overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                finish();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    myThread.start();
}

The fade_in.xml and fade_out.xml were from https://stackoverflow.com/a/18475926/9386861

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
Max Ku
  • 25
  • 7
  • You can only perform UI operations on the main/UI thread. The Handler is on the UI thread by default in this case.. And when you're creating a new Thread, it's not the main/UI Thread. – HedeH Apr 15 '18 at 09:54
  • @Hed Shafran, you should write an answer from your comment so that the question appear as answered (and solved :) – LundinCast Apr 15 '18 at 10:00
  • Done.. Thanks :) – HedeH Apr 15 '18 at 10:08

1 Answers1

1

You can only perform UI operations on the main/UI thread.

The Handler is on the UI thread by default in this case.. And when you're creating a new Thread, it's not the main/UI Thread.

So (for example) if you wanted to run this operation from the Thread you created you can do the Following:

new Thread() {
  @Override
  public void run() {
    super.run();

    Handler handler = new Handler(Looper.getMainLooper()); //Create a Handler to run on the main/UI Thread like this.
    handler.post(new Runnable() {
      @Override
      public void run() {
        // Your operation on the UI Thread
      }
    });
  }
}.start();

You can read about the Handler constructors and Loopers to understand the behaviour: https://developer.android.com/reference/android/os/Handler.html

HedeH
  • 2,869
  • 16
  • 25