В окне чата у меня есть функция, как самоуничтожение сообщения через некоторое время. Для которого у меня есть класс, который показывает горящую анимацию после продолжительности. При отправке текста обработчик и таймер, которые я использовал в приведенном ниже классе, работают нормально 2-3 раза, после чего обнаруживается некоторое несоответствие анимации, поскольку огонь не начинается в точном месте.
Кроме этого, при отправке файла из фрагмента средства выбора файлов, когда он возвращается в окно просмотра окна чата, ничего не происходит, пока я не коснусь экрана и не прокруту его немного. Во время отладки я заметил, что в первый раз, когда bindview вызывается после отправки файла, обработчик и таймер не работают должным образом. Вместо этого, если я возвращаюсь назад и снова захожу в окно чата, это работает отлично. Тогда он прекрасно записывает сообщение.
Класс горелки:
public class Burner {
private static final TaggedLogger logger = new TaggedLogger("Burner");
public static void burnMessage(final TextMessageViewHolder holder, final BurnerListener listener) {
final int DURATION = 3000;
if (!holder.isBurning) {
final Handler handler = new Handler(Looper.getMainLooper());
final Animator.AnimatorListener animatorListener = new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
logger.log("onAnimationStart");
}
@Override
public void onAnimationEnd(Animator animator) {
listener.onBurnFinished();
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
};
holder.isBurning = true;
holder.fireAnimationHolder.setVisibility(View.VISIBLE);
holder.fireAnimationHolder.measure(0, 0);
Activity activity = (Activity) ChatProperties.getChatWindowContext();
if (activity != null) {
final ParticleSystem particleSystem = new ParticleSystem(activity, 48, R.drawable.fire_2, DURATION)
.setSpeedByComponentsRange(-0.025f, 0.0f, -0.06f, -0.08f)
.setAcceleration(0.00003f, 0)
.setInitialRotationRange(30, 45)
.addModifier(new AlphaModifier(255, 0, 200, 1000))
.addModifier(new ScaleModifier(0.5f, 2f, 0, 1000));
holder.fireAnimationHolder.post(new Runnable() {
@Override
public void run() {
holder.fireAnimationHolder.measure(0,0);
int fireAnimationHolderWidth = holder.fireAnimationHolder.getWidth();
// logger.log("fireAnimationHolderWidth = " + fireAnimationHolderWidth);
particleSystem.emit(holder.fireSource, 12);
holder.fireSource.animate().translationXBy(fireAnimationHolderWidth).setStartDelay(500).setDuration(DURATION).setListener(animatorListener).start();
holder.fireSourceController.setPivotX(0);
holder.fireSourceController.animate().alpha(1f).scaleX(1f).setDuration(DURATION).start();
}
});
new Timer().scheduleAtFixedRate(new TimerTask() {
int elapsedTime = 0;
@Override
public void run() {
elapsedTime += 300;
if (elapsedTime >= DURATION) {
handler.post(new Runnable() {
@Override
public void run() {
particleSystem.cancel();
}
});
this.cancel();
} else {
handler.post(new Runnable() {
@Override
public void run() {
particleSystem.updateEmitPoint(holder.fireSource, Gravity.CENTER);
}
});
}
}
}, 100, 300);
}
}
}
Этот метод burnMessage вызывается из bindview метода bindview держателя TextMessageViewholder, а FilemessageViewHolder расширяет класс TextMessageViewHoler.
В методе bindview TextMessageViewHolder эта функция вызывается, если это самоуничтожающееся сообщение:
private void handleMessageBurning(final Message message) {
if (message.imBurnTime > 0 && BurnMessageHelper.animatedBurnMessageEntryMap.containsKey(message.callerId)) {
Log.e("BurnThread","message to be burned");
Burner.burnMessage(this, new BurnerListener() {
@Override
public void onBurnFinished() {
if (ChatProperties.isGroupChat) {
DataHelper.getInstance().deleteGroupMessage(Target.target, message.callerId);
} else {
DataHelper.getInstance().deleteMessage(Target.target, message.callerId);
}
BurnMessageHelper.animatedBurnMessageEntryMap.remove(message.callerId);
isBurning = false;
}
});
} else {
fireAnimationHolder.setVisibility(View.GONE);
}
}
Что здесь происходит? Поток таймера не может быть запущен в главном потоке здесь по какой-то причине? Пожалуйста помоги. Спасибо.
N.B. Я пробовал это в Зефире, Нуге и Орео.