2012-03-04 9 views
1

私はすでにwidgetのアプリケーションを持っていて、そのウィジェットを5秒ごとに更新するserviceを持っています。AlarmManager LifeCycle and Canceling Error

は、ここに私の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. setRepeatingメソッドのパラメータがあるSystemClock.elapsedRealtime()のために何が?いつ始めるべきか指摘していますか?

  2. ウィジェットを削除しようとすると、以下のエラーが表示されます(残念ながらAlarmManagerはまだキャンセルされません)。私は何が欠けていますか?

  3. ウィジェットが初期化(または呼び出し)される前に、いくつかのネットワーク操作を行う必要があります。ウィジェットにはサーバーからのデータが必要です。 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にしか存在しません。したがって変数PendingIntentを以前と同じ方法で作り直してください。すでにキャンセルしている場合はキャンセルしてください。

  3. AsyncTaskのようなものには適しています。 AsyncTaskは、管理スレッドをバックグラウンドで生成し、UIスレッドが継続している間は機能し、完了したらUIスレッドを更新できます。だからあなたがするためにたくさんのネットワークがあれば、AsyncTaskはそれを美しく扱います。 AsyncTaskのドキュメントは非常に便利です。それらを見つけるhere。これにはさまざまな選択肢がありますので、この3つ目の点についてもう少し詳しく説明して、より適切な回答を得る必要があります。

+0

ありがとうございます。 AsyncTaskはまだ試していませんでしたが、それについての手がかりを得ました。 –