Я создал виджет WiFi, который предоставляет пользователю легкий доступ к WiFi.
Функциональные возможности виджета работают нормально.
Теперь я хочу показать анимацию виджету. При подключении сигнальной полосы периодически загорайтесь один раз и поднимайтесь вверх, пока не включится WiFi.
Для этого я создал массив изображений с разными уровнями сигнала.
Во время соединения я вызываю метод startAnimation.
public void StartAnimation()
{
System.out.println("start");
frame = 0;
animationFlag = true;
if(!handler.hasMessages(0))
handler.postDelayed(AnimateRunnable, FRAME_RATE);
}
Из satrtAnimation я делаю анимацию Flag в true.
После этого состояние становится Enbaled или Not connected. В этот раз я вызываю метод stopAnimation.
public void StopAnimation()
{
System.out.println("Stop Animation Before:"+animationFlag);
animationFlag = false;
System.out.println("Stop Animation:After:"+animationFlag);
if(!handler.hasMessages(0)) {
System.out.println("handler.hasmessage0");
handler.removeCallbacks(AnimateRunnable);
}
}
Здесь я делаю анимационный флаг ложным. и печать его значений до и после. Отображается правильно.
Но в My Runnable флаг анимации остается верным. Так что мой виджет зависает
final Runnable AnimateRunnable =new Runnable(){
public void run()
{
System.out.println("run:"+animationFlag);
if(animationFlag)
{
System.out.println("Animation Flag:"+animationFlag);
AppWidgetManager ap =AppWidgetManager.getInstance(mContext);
frame = ++frame%5;
remoteViews.setImageViewResource(R.id.wifi_signal_strength,rangeImages[frame]);
ap.updateAppWidget(thisWidget, remoteViews);
handler.postDelayed(AnimateRunnable, FRAME_RATE);
}
}
};