La mise à jour de l'INTERFACE utilisateur à partir d'un service (à l'aide d'un gestionnaire?)
Je suis en train de mettre à jour mon INTERFACE dans FirstActivity
quand je reçois une notification, mais est confondu par runOnUiThread
, Runnable
et Handler
. Voici ce que j'ai: je suis en cours d'exécution FirstActivity et NotificationService. Lorsque NotificationService reeives une notification, elle sera mise à jour FirstActivity de l'INTERFACE utilisateur.
J'ai aussi un autre service de AlarmService
en cours d'exécution.
Première Activité
@Override
public void onResume() {
super.onResume();
//some other code for alarm service
}
NotificationService
//on receiving notification
private void showNotification(String text) {
//Get activity
Class<?> activityClass = null;
try {
activityClass = Class.forName("com.pakage.FirstActivity");
contextActivity = (Activity) activityClass.newInstance();
//Update UI on FirstActivity not working
contextActivity.runOnUiThread(new Runnable() {
public void run()
{
Looper.prepare();
TextView tv = (TextView ) contextActivity.findViewById(R.id.notifyTest);
Looper.loop();
}
});
} catch (Exception e) {
e.printStackTrace();
}
//Shows the notification
Notification n = new Notification();
//... etc
}
Je reçois un looper.préparer erreur. Dois-je mettre les codes dans mon FirstActivity?
pouvez-vous nous montrer les messages dans votre journal de logcat? Aussi, comment avez-vous déclarer le Looper?
Je suis
Vous obtenez cette erreur, parce que vous êtes en cours d'exécution de votre code sur le thread d'INTERFACE utilisateur, qui possède déjà un Looper de cycle de vie. Pour éviter cette erreur, vous pouvez simplement supprimer
Je suis
Can't create handler inside thread that has not called Looper.prepare()
erreur. Looper est déclarée dans le showNotification
méthode ci-dessusVous obtenez cette erreur, parce que vous êtes en cours d'exécution de votre code sur le thread d'INTERFACE utilisateur, qui possède déjà un Looper de cycle de vie. Pour éviter cette erreur, vous pouvez simplement supprimer
Looper.prepare()
, mais il fait un non-sens puisque " Looper.loop()' pourrait bloquer le thread entier et l'INTERFACE utilisateur de votre application ni travail, ni répondre plus!
OriginalL'auteur newbie | 2011-10-29
Vous devez vous connecter pour publier un commentaire.
Mon 1er instinct, c'est que vous devrait à la place de l'Activité lier à votre service et à manipuler l'INTERFACE utilisateur de mise à jour sur son côté au lieu de la prestation directement la modification de l'Activité.
Voir plus d'infos ici:
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
Et un exemple ici:
Exemple: la Communication entre l'Activité et le Service à l'aide de la Messagerie
OriginalL'auteur TJB
J'ai toujours eu juste le service d'incendie à une Diffusion et ensuite dans mon Activité, j'ai un BroadcastReciever à l'écoute de l'Émission. C'est une approche qui est beaucoup plus simple que celui que vous avez indiqué ci-dessus.
OriginalL'auteur Kurtis Nusbaum
Je n'ai aucune idée de pourquoi vous mettez un Looper de
parce que l'INTERFACE utilisateur (principale) de thread a déjà un Looper/Gestionnaire etc..
Même si elle a fait un travail
Looper.loop()
va bloquer et puisque vous êtes en cours d'exécution sur le thread de l'INTERFACE utilisateur, il permet de bloquer le thread d'INTERFACE utilisateur qui n'est pas ce que vous voulez.Ce que vous voulez vraiment, c'est
Vous n'avez pas vraiment besoin de faire tout cela de fantaisie pour obtenir l'Activité
en supposant que le Service et l'Activité sont à la fois exécutant dans le même processus, vous pouvez juste enregistrer une référence à l'Activité, mais être prudent de mettre à jour la référence lorsque l'Activité est détruite.
FirstActivity.runOnUiThread
.mise à jour de ma question trop
OriginalL'auteur Jasoneer