我正在开发一个应用程序,我想在 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/