AppWidgetProvider is a subclass of BroadcastReceiver, and can (and will) be
destroyed soon after processing an event. Do not store your data or object
references there.

--
Kostya Vasilyev
15.07.2011 12:04 пользователь "cathal coffey" <coffey.cat...@gmail.com>
написал:
> Hey guys,
>
> I have an app widget which looks like this.
>
> public class MyWidget extends AppWidgetProvider
> {
> public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";
> public Timer timer = new Timer();
> public int count = 0;
>
> @Override
> public void onUpdate(Context context, AppWidgetManager
> appWidgetManager, int[] appWidgetIds)
> {
> RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
> R.layout.main);
>
> Intent active = new Intent(context, MyWidget.class);
> active.setAction(ACTION_WIDGET_RECEIVER);
> active.putExtra("msg", "Message for Button 1");
>
> PendingIntent actionPendingIntent =
> PendingIntent.getBroadcast(context, 0, active, 0);
> remoteViews.setOnClickPendingIntent(R.id.button_one,
> actionPendingIntent);
> appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
> }
>
> @Override
> public void onReceive(Context context, Intent intent)
> {
> if (intent.getAction().equals(ACTION_WIDGET_RECEIVER))
> {
> final AppWidgetManager appWidgetManager =
> AppWidgetManager.getInstance(context);
> final ComponentName thisWidget = new ComponentName(context,
> MyWidget.class.getName());
>
> count = 0;
> timer.cancel();
> timer.purge();
>
> timer = new Timer();
> timer.scheduleAtFixedRate(new UpdatedTimerTask(this, context,
> appWidgetManager), 0, 1000);
> }
>
> super.onReceive(context, intent);
> }
> }
>
> My UpdatedTimerTask looks like this.
>
> public class UpdatedTimerTask extends TimerTask
> {
> private Context context;
> private AppWidgetManager appWidgetManager;
>
> private RemoteViews remoteViews;
> private ComponentName thisWidget;
>
> private MyWidget widget;
>
> public UpdatedTimerTask(MyWidget widget, Context context,
> AppWidgetManager appWidgetManager)
> {
> this.widget = widget;
> this.context = context;
> this.appWidgetManager = appWidgetManager;
>
> this.remoteViews = new RemoteViews(context.getPackageName(),
> R.layout.main);
> this.thisWidget = new ComponentName(context, MyWidget.class);
> }
>
> @Override
> public void run()
> {
> this.remoteViews.setTextViewText(R.id.label3, "Count: " +
> widget.count);
> this.appWidgetManager.updateAppWidget(this.thisWidget,
> this.remoteViews);
> widget.count ++;
> }
> }
>
> When I press Button1 on this widget its acts as I would expect. The
> count gets updated every second and displays in label3.
> Button1
> Count: 1
> Count: 2
> Count: 3
> etc
>
> However when I press Button1 again I expect the count to reset to 0
> and continue from there.
> Whats actually happening is the two Timers are firing overlapped.
>
> Button1
> Count: 1
> Count: 2
> Count: 3
> Button1
> Count: 1
> Count: 4
> Count: 2
> etc
>
> Why aren't my calls to timer.cancel() and timer.purge() stopping the
> first timer before replacing it?
> How do I fix this issue???
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to android-developers@googlegroups.com
> To unsubscribe from this group, send email to
> android-developers+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to