Причина, по которой ваш делегат не отписался, заключается в том, что ImageAnimator
сравнивает адрес делегата с адресом делегата, на которого вы изначально подписаны. Делегат, которого вы передали StopAnimate
, не тот делегат, которого вы передали Animate
.
Это соответствующий фрагмент кода в StopAnimate
:
try {
// Find the corresponding reference and remove it
for(int i = 0; i < imageInfoList.Count; i++) {
ImageInfo imageInfo = imageInfoList[i];
if(image == imageInfo.Image) {
if((onFrameChangedHandler == imageInfo.FrameChangedHandler) || (onFrameChangedHandler != null && onFrameChangedHandler.Equals(imageInfo.FrameChangedHandler))) {
imageInfoList.Remove(imageInfo);
}
break;
}
}
}
Обратите внимание на сравнение onFrameChangedHandler
.
ImageAnimator
использует один поток, поэтому все анимированные изображения в вашем приложении могут быть анимированы одним потоком. Если вы уничтожите рабочий поток, все анимированные изображения в вашем приложении прекратят анимацию. Это может быть хорошо, если у вас есть только один, но, вероятно, не то, что вы хотите, в большинстве случаев.
Animate
и StopAnimate
работают нормально; вам просто нужно правильно их назвать.