2010-11-14 19 views
2

J'ai des problèmes pour appeler une fonction de classe à partir de mon widget à la suite d'une action de maintenance.Android Widget + Service

public class HelloWidget extends AppWidgetProvider { 

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

     Intent intent = new Intent(context, NeoService.class); 
     context.startService(intent); 

     MyClass mClass = new MyClass(context, appWidgetManager); 
     mClass.doUpdate(); 

     super.onUpdate(context, appWidgetManager, appWidgetIds); 
    } 
} 

L'appel à mClass.doUpdate() ci-dessus fonctionne très bien. Mais lorsque je tente de le faire à nouveau dans mon OnReceive cela ne fonctionne pas et je reçois un FORCECLOSE dès que l'action correcte est reçue:

@Override 
    public void onReceive(Context context, Intent intent) { 

    if(Intent.ACTION_TIME_TICK.equals(action)) 
    { 
     mTime.doUpdate(); 
    // Toast.makeText(context, "TicK Tock!", Toast.LENGTH_LONG).show(); 
    } 
} 

Si je commente le mTime.doUpdate(); et décommentez le Toast, il affiche le pain grillé comme il se doit.

Edit: Le message d'erreur que je reçois est la suivante:

11-18 18:25:00.201: ERROR/AndroidRuntime(2759): FATAL EXCEPTION: main 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.TIME_TICK flg=0x40000004 (has extras) } in [email protected] 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:905) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at android.os.Handler.handleCallback(Handler.java:587) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at android.os.Handler.dispatchMessage(Handler.java:92) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at android.os.Looper.loop(Looper.java:123) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at java.lang.reflect.Method.invoke(Method.java:521) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at dalvik.system.NativeStart.main(Native Method) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759): Caused by: java.lang.NullPointerException 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at de.thesmile.android.widget.HelloWidget.onReceive(HelloWidget.java:45) 
11-18 18:25:00.201: ERROR/AndroidRuntime(2759):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:892) 
+0

Utiliser 'adb logcat', DDMS, ou la perspective DDMS dans Eclipse pour examiner LogCat et regardez la trace de pile associée à votre "forceclose". De plus, gardez à l'esprit que 'doUpdate()' et 'doDaUpdate()' ne sont pas la même méthode. – CommonsWare

+0

Désolé mon mauvais, ils sont tous deux nommés pareil, le "Da" n'appartient pas là. J'ai des problèmes en ce que je ne peux pas obtenir mon Galaxy Tab pour se signaler comme "Debug" capable de sorte que je ne peux pas passer à travers le programme pour trouver des problèmes. J'ai essayé toutes les choses aujourd'hui en vain. – Hamid

Répondre

7

Votre problème résulte du cycle de vie des BroadcastReceiver. Le AppWidgetProvider est un BroadcastReceiver et le BroadcastReceiver est considéré comme actif uniquement lors de l'exécution de la méthode de rappel. Lorsque le BroadcastReceiver est inactif (donc après le retour de la méthode de rappel) votre processus peut être tué à tout moment si le système a besoin de mémoire. Lorsque le processus est tué, votre objet mTime est également tué, ce qui provoque l'exception NullPointerException.

Il est bien expliqué ici: (en particulier la seconde "Note:") http://developer.android.com/guide/topics/appwidgets/index.html#AppWidgetProvider

et ici: http://developer.android.com/guide/topics/fundamentals.html#broadlife