154 votes

Comment définir des rappels dans Android?

Lors de la dernière google io il y avait une présentation sur la mise en œuvre reposant applications client. Malheureusement, ce n'était qu'une discussion à haut niveau sans le code source de l'application. Il y a un point d'achoppement pour moi que je n'arrive pas à trouver aucune information à ce sujet et il n'est pas nécessaire d'avoir vu la présentation pour être en mesure de répondre à cette question. Dans ce diagramme ( http://i.imgur.com/GlYQF.gif ) sur le chemin de retour, il existe différents rappels à d'autres méthodes. Ce que je ne comprends pas, c'est comment je déclare que ces méthodes sont. En d'autres termes, je comprends l'idée d'un rappel (un morceau de code qui est appelé après un certain événement qui s'est passé), mais je ne sais pas comment la mettre en œuvre et je n'ai pas été en mesure de trouver une explication appropriée pour android en ligne encore. La seule façon que j'ai mis en place des rappels ont été jusqu'à présent primordial de diverses méthodes (onActivityResult par exemple).

J'ai l'impression d'avoir une compréhension de base de la conception de ce modèle, mais j'obtiens toujours trébucher sur la façon de gérer le chemin de retour. Merci pour toute aide.

225voto

EboMike Points 39257

Dans de nombreux cas, vous avez une interface et transmettez un objet qui l'implémente. Les boîtes de dialogue, par exemple, ont le OnClickListener.

Juste comme un exemple aléatoire:

 // The callback interface
interface MyCallback {
    void callbackCall();
}

// The class that takes the callback
class Worker {
   MyCallback callback;

   void onEvent() {
      callback.callbackCall();
   }
}

// Option 1:

class Callback implements MyCallback {
   void callbackCall() {
      // callback code goes here
   }
}

worker.callback = new Callback();

// Option 2:

worker.callback = new MyCallback() {

   void callbackCall() {
      // callback code goes here
   }
};
 

J'ai probablement foiré la syntaxe de l'option 2. C'est tôt.

52voto

Haraldo Points 1413

Je cherchais un certain temps pour trouver un exemple d'une fonction de rappel.

Ce dont j'avais besoin était un exemple comme EboMike a fait ci-dessus. Je ne pouvais pas obtenir les exemples ci-dessus à travailler pour moi, mais trouve l'exemple suivant a été parfait.

Le rappel générées est à partir d'un affichage personnalisé. Lorsque quelque chose arrive à mon point de vue, je déclenche un événement que mon activité est à l'écoute pour:

    // DECLARED IN CUSTOM VIEW
    private OnScoreSavedListener onScoreSavedListener;
    public interface OnScoreSavedListener {
        public void onScoreSaved();
    }
    // ALLOWS YOU TO SET LISTENER && INVOKE THE OVERIDING METHOD 
    // FROM WITHIN ACTIVITY
    public void setOnScoreSavedListener(OnScoreSavedListener listener) {
        onScoreSavedListener = listener;
    }
    // DECLARED IN ACTIVITY
    MyCustomView slider = (MyCustomView) view.findViewById(R.id.slider)
    slider.setOnScoreSavedListener(new OnScoreSavedListener() {
        @Override
        public void onScoreSaved() {
            Log.v("","EVENT FIRED");
        }
    });

Si vous voulez en savoir plus sur la communication (rappels) entre les fragments, voir ici: http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

J'espère que cela aide les autres.

38voto

dragon Points 899

Pas besoin de définir une nouvelle interface lorsque vous pouvez en utiliser une existante: android.os.Handler.Callback . Passez un objet de type Callback et appelez les fonctions de rappel handleMessage(Message msg) .

21voto

MrGnu Points 106

pour clarifier un peu sur le dragon de la réponse (puisqu'il m'a fallu un certain temps à comprendre de quoi faire avec Handler.Callback):

Handler peut être utilisé pour exécuter des rappels dans l'actuel ou un autre thread, en le passant Messages. l' Message détient des données à partir de la fonction de rappel. un Handler.Callback peut être transmis au constructeur de Handler afin d'éviter l'extension de Gestionnaire directement. ainsi, pour exécuter un code via le rappel de ce thread:

Message message = new Message();
<set data to be passed to callback - eg message.obj, message.arg1 etc - here>

Callback callback = new Callback() {
    public boolean handleMessage(Message msg) {
        <code to be executed during callback>
    }
};

Handler handler = new Handler(callback);
handler.sendMessage(message);

EDIT: viens de réaliser il y a une meilleure façon d'obtenir le même résultat (moins de contrôle de exactement quand pour exécuter la fonction de rappel):

post(new Runnable() {
    @Override
    public void run() {
        <code to be executed during callback>
    }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X