AnimationDrawable
выполняется в потоке пользовательского интерфейса.Анонимный экземпляр Handler
, созданный без параметров, переданных для Looper
, также выполняется в потоке пользовательского интерфейса.Следовательно, постановка в очередь действия для изменения на Handler
через какое-то время может не произойти, пока не завершится AnimationDrawable
, потому что они оба находятся на одном и том же Thread
Попробуйте использовать Timer
вместо?
Timer timer = new Timer();
timer.schedule(new TimerTask(){
public void run() {
Intent intent = new Intent(LoginTestActivity.this,
SPLoginActivity.class);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(LoginTestActivity.this,
logo,
ViewCompat.getTransitionName(logo));
startActivity(intent, options.toBundle());
}
}, 300);
Timer
выполняется в фоновом потоке , и, поскольку он быстро выходит, он не должен вызывать утечек памяти AFAIK.
РЕДАКТИРОВАТЬ: Похоже, что запуск Activity выполняется в внутренне (строка 4614) в платформе Android и может быть вялым, если попытаться выполнить из-за пределов пользовательского интерфейса .Вы можете попытаться опубликовать новое намерение в начале очереди сообщений потока пользовательского интерфейса и посмотреть, работает ли это, но это, вероятно, приведет к остановке анимации в любом случае, поскольку тот же поток пользовательского интерфейса теперь используется для обработки запуска операции.
Timer timer = new Timer();
timer.schedule(new TimerTask(){
public void run() {
new Handler(Looper.getMainLooper()).postAtFrontOfQueue(() -> {
Intent intent = new Intent(LoginTestActivity.this,
SPLoginActivity.class);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(LoginTestActivity.this,
logo,
ViewCompat.getTransitionName(logo));
startActivity(intent, options.toBundle());
});
}
}, 300);