#android #multithreading #animation #fragment #handler
#Android #многопоточность #Анимация #фрагмент #обработчик
Вопрос:
У меня есть простой фрагмент с этим в методе onViewCreated:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (account != null) {
try {
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(() ->
{
String decryptedCode;
try {
decryptedCode = (vaultService).getDecryptedPassword(account).trim();
in_password.setText(decryptedCode);
} catch (Exception e) {
Helper.showMessage(e.toString());
} finally {
in_password_layout.setHelperText("");
}
}, 1);
} catch (Exception e) {
Helper.showMessage(e.toString());
}
}
}
и вызов функции, которую я имею:
protected void openFragment(BaseFragment fragment) {
fragment.setCaller(this);
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.activity_slide_in_right, R.anim.activity_slide_out_left, R.anim.activity_slide_out_right, R.anim.activity_slide_in_left);
fragmentTransaction.replace(R.id.content_frame, fragment);
fragmentTransaction.addToBackStack(fragment.getClass().getName());
fragmentTransaction.commit();
}
Проблема, с которой я сталкиваюсь, заключается в том, что если я удаляю вызов обработчика из метода onViewCreated, переход происходит идеально. Если я помещаю обработчик, например, так, он убивает анимацию и просто показывает фрагмент без какой-либо анимации.
Если я использую handler.postInFrontOfQueue, анимация работает, но требуется некоторое время, прежде чем войти. Это означает, что сначала он обрабатывает обработчик, а только затем выполняет анимацию и переходит к фрагменту.
У вас есть какие-нибудь идеи, как я могу предотвратить это? Я уже пробовал в независимом потоке, и это не работает.
Спасибо.
Ответ №1:
Я только что нашел решение. Я должен указать количество времени, необходимое для появления анимации, во 2-м параметре метода postDelayed.
В моем случае:
getResources().getInteger(android.R.integer.config_mediumAnimTime)
Таким образом, он запускает обработчик только после завершения анимации.
Не совсем то, что я хотел, но это работает. Я бы предпочел, чтобы оба процесса выполнялись параллельно, чтобы по завершении анимации обработчик также выполнял свою работу.