Я встретил эту проблему тоже, когда я хочу getTransformation() для следующей анимации после предыдущей анимации сделано, то бесконечный цикл причина StackOverflow.
Я проанализировал проблемы с исходным кодом Android от GrepCode с кодами ниже в getTransformation()
, я никогда не найти каких-либо проблем, которые бы вызвать бесконечный цикл, так как только место вызова onAnimationEnd()
, он установит mEnded
в действительности. При следующем звонке getTransformation()
он должен быть заблокирован if(!mEnded)
, но это не так.
if (expired) {
if (mRepeatCount == mRepeated) {
if (!mEnded) {
mEnded = true; //this is not real!!!
if (mListener != null) {
mListener.onAnimationEnd(this);
}
}
} else {
if (mRepeatCount > 0) {
mRepeated++;
}
if (mRepeatMode == REVERSE) {
mCycleFlip = !mCycleFlip;
}
mStartTime = -1;
mMore = true;
if (mListener != null) {
mListener.onAnimationRepeat(this);
}
}
}
Он не соответствует этим сегментам кода grepcode. Истина заключается в том, что eEnded = true
устанавливается после onAnimationEnd()
называется:
if (!mEnded) {
if (mListener != null) {
mListener.onAnimationEnd(this);
}
//it happen after onAnimationEnd(). cancel() is also does as this
mEnded = true;
}
Это должно объяснить, почему бесконечный цикл происходит. Даже вы проверяете animation.hasEnded()
не помогли бы, так как он не мог дотянуться до установленного значения mEnded.
Пути я пробивающий с этой проблемой является:
Установить флаг в слушателе для защиты:
boolean needBlock = false;
public void onAnimationEnd(Animation animation)
{
if (needBlock) return;
needBlock = true;
Transformation t= new Transformation();
animation.getTransformation(animation.getDuration(), t);
}
Clear AnimationListner. При необходимости, мы можем установить обратно после
public void onAnimationEnd(Animation animation)
{
animation.setAnimationListener(null);
Transformation t= new Transformation();
animation.getTransformation(animation.getDuration(), t);
animation.setAnimationListener(this);
}
андроид код из GrepCode является version2.2.2 для андроида версии <= 2,1 'починили = true' действительно за' onAnimationEnd() '. Я разработал андроид на уровне 8, так что проблема произошла. Для последней версии Android она не должна иметь такой бесконечный цикл – Ider