2012-03-04 89 views
1

我已经有一个应用程序已经widget已经有一个service它每5秒更新一次该小部件。AlarmManager生命周期和取消错误

这里是我的AppWidgetProvider

public class MyWidget extends AppWidgetProvider { 

    PendingIntent service = null; 
    AlarmManager alarmManager; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 

     alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     final Intent i = new Intent(context, MyService.class); 

     if(service == null) { 
      service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 
     } 

     alarmManager.setRepeating(AlarmManager.RTC, SystemClock.elapsedRealtime(), 1000*5, service); 
    } 

    @Override 
    public void onDisabled(Context context) { 
     Log.d("LogTag", "onDisabled"); 
     alarmManager.cancel(service); 
     service.cancel(); 
    } 
} 

而且我Service

public class MyService extends Service { 

    int b = 5; 

    @Override 
    public void onCreate() { super.onCreate(); } 

    public int onStartCommand(Intent intent, int flags, int startId) { 
     this.buildUpdate(); 
     return 0; 
    } 

    private void buildUpdate() { 
     Log.d("AAA", "Update is coming"); 

     RemoteViews rmViews = new RemoteViews(getPackageName(), R.layout.widget_layout); 

     rmViews.setTextViewText(R.id.hello, "Iterator: " + Integer.toString(b)); 

     ComponentName thisWidget = new ComponentName(this, MyWidget.class); 

     AppWidgetManager manager = AppWidgetManager.getInstance(this); 

     manager.updateAppWidget(thisWidget, rmViews); 

     b++; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

} 

Service和其他一切都很好。但我仍一直对所有这些东西对夫妇的问题:

  1. 什么是对SystemClock.elapsedRealtime()这是setRepeating方法的参数?它指出什么时候开始?

  2. 当我尝试删除小部件时,出现了一些错误(在下面),不幸的是AlarmManager仍然无法取消。我错过了什么?

  3. 在小部件初始化(或调用)之前,我需要做一些网络操作。 Widget应该有一些来自服务器的数据。我应该使用AsyncTask还是什么?

当我尝试删除小工具,越来越:

03-04 23:39:51.428: E/AndroidRuntime(5646): Uncaught handler: thread main exiting due to uncaught exception 
03-04 23:39:51.438: E/AndroidRuntime(5646): java.lang.RuntimeException: Unable to start receiver com.example.widget.MyWidget: java.lang.NullPointerException 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2646) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.app.ActivityThread.access$3100(ActivityThread.java:119) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.os.Looper.loop(Looper.java:123) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at dalvik.system.NativeStart.main(Native Method) 
03-04 23:39:51.438: E/AndroidRuntime(5646): Caused by: java.lang.NullPointerException 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at com.example.widget.MyWidget(MyWidget.java:33) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:76) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2637) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  ... 10 more 

回答

2
  1. SystemClock.elapsedRealTime()你有它目前在triggerAtTime参数,这意味着任何号码,你放在那里是时间,你希望警报消失。 elapsedRealtime()以系统启动后的毫秒计算,包括深度睡眠。测量可能跨越系统睡眠周期的时间间隔时应使用此时钟。

  2. 在你的onDisabled方法中,你需要重新创建整个PendingIntent。我的猜测是,它是空的,因为它实际上并不存在,当你打电话onDisabled,但只存在于onUpdate。因此,重新创建service变量PendingIntent完全相同的方式,然后像以前一样调用cancel。

  3. AsyncTask s对这样的事情很好。 AsyncTask在后台衍生出一个托管线程,并在UI线程继续进行时工作,然后可以在完成时更新UI线程。所以如果你有很多繁重的网络工作,AsyncTask会处理的很好。 AsyncTask上的文档非常有用。找到他们here。这取决于你在做什么,有许多选择,所以你必须在第三点解释你的问题,以获得更加定制的答案。

+0

谢谢。没有尝试AsyncTask,但得到了一些线索。 – 2012-03-05 00:02:29