java - 为什么淡入淡出 Activity 转换只能使用 Handler 而不能使用 Thread?

标签 java android android-activity

我正在开发一个应用程序,我想在 SplashScreen 上实现自动转换效果。

我尝试过 Thread,但没有显示转换。

但是,如果我使用 Handler 来代替,则转换工作正常。

为什么它只适用于Handler?有人可以给我解释一下吗?

处理程序版本

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

线程版本

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

fade_in.xml 和 fade_out.xml 来自 https://stackoverflow.com/a/18475926/9386861

最佳答案

只能在主/UI线程上执行UI操作。

在这种情况下,默认情况下处理程序位于 UI 线程上。当您创建新线程时,它不是主/UI 线程。

因此(例如)如果您想从您创建的线程运行此操作,您可以执行以下操作:

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

您可以阅读有关 Handler 构造函数和 Loopers 的内容来了解​​其行为:https://developer.android.com/reference/android/os/Handler.html

关于java - 为什么淡入淡出 Activity 转换只能使用 Handler 而不能使用 Thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49840601/

相关文章:

java - (图书馆) checkout 状态返回所有 "true"

java - 列出具有条件的联接表

android - 如何在android上获取文件路径?

android - 在 Activity 之间改变焦点

java - 深度嵌套链中的 fragment 之间如何通信?

java - 如何使用 Java 和 MySQL 确定插入或更新是否成功?

java - setValueAt(对象aValue, int row, int col)

android - Flutter - 垂直拖动时更改高度

android - 细微差别识别器错误问题

android - 我怎样才能杀死一个 Activity - Android