2017-09-05 1 views
1

Bonjour J'ai implémenté le poussoir pour le chat en temps réel et l'abonnement au canal poussoir, mais j'ai beaucoup d'activités et de fragments où je veux écouter les événements pushr. J'ai ajouté ce code dans chaque activité/fragment, mais le problème est qu'il crée plusieurs abonnements pour chaque identifiant. Je sais que je dois utiliser Singleton pour cela quelqu'un peut-il me diriger dans la bonne direction pour y parvenir?Abonnement à la chaîne Android Pusher Singleton

Voici le code que je suis en train d'écrire dans toutes les activités/fragment

private PusherOptions options; 
private Channel channel; 
private Pusher pusher;  
options = new PusherOptions(); 
options.setCluster("ap2"); 
pusher = new Pusher("afbfc1f591fd7b70190f", options); 
pusher.connect(); 

    profile_id = Global.shared().preferences.getString("PROFILE_ID", " "); 

    channel = pusher.subscribe(profile_id); 
    channel.bind("message", 
      new SubscriptionEventListener() { 
       @Override 
       public void onEvent(String s, String s1, final String data) { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          try { 
           JSONObject result = new JSONObject(data); 
           String message = result.getString("message"); 
           String time = result.getString("time"); 
           String reId = result.getString("recieverId"); 
           new_message = message; 
           getConvoData(k, message); 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
          System.out.println("DATA ====>>" + data); 
         } 
        }); 
       } 
      }); 
+0

Avez-vous essayé de mettre le code d'instanciation Pusher dans votre classe Application? C'est la manière la plus simple possible d'obtenir une seule instance par application à laquelle vous pouvez accéder à partir de chaque fragment/activité. Une meilleure façon de le faire serait d'utiliser quelque chose comme Dague pour l'injection de dépendance: https://google.github.io/dagger/ – zmarkan

+0

J'ai pu implémenter cela correctement, merci beaucoup, maintenant pouvez-vous me suggérer comment puis-je refléter ces changements dans mon activité/fragment afin que je puisse mettre à jour mon adaptateur en écoutant ces événements pousseurs, par exemple je veux écouter l'événement "message" et mettre à jour le chat et la liste de chat dans ChatActivity, comment puis-je y arriver? en envoyant des données de la classe globale à une activité spécifique, merci encore. –

Répondre

0

Vous pouvez exposer channel dans votre classe Global. Cela vous permettra d'appeler le bind et le unbind dans vos fragments, quand ils sont au premier plan.

connectToPusher devrait juste créer un canal et s'abonner à lui.

En Global.java:

private Channel channel; 

public void connectTopusher() { 
    PusherOptions options; 
    Pusher pusher; 
    options = new PusherOptions(); 
    options.setCluster("ap2"); 
    pusher = new Pusher("afbfc1f591fd7b70190f", options); 
    pusher.connect(); 
    String profile = Global.shared().preferences.getString("PROFILE_ID", ""); 
    this.channel = pusher.subscribe(profile); 
} 

public Channel getChannel(){ 
    return this.channel; 
} 

Et puis dans votre activité/fragment, vous pouvez lier/délier vos auditeurs quand ils sont repris/pause - juste garder une référence à elle comme ceci:

YourActivity.java (pourrait aussi être votre Fragment)

private SubscriptionEventListener messageListener = new SubscriptionEventListener(){ 
    @Override 
    public void onEvent(String channel, String event, String data) { 
     //TODO: do something with events 
    } 
} 

//Bind when the listener comes into the foreground: 
@Override 
protected void onResume() { 
    super.onResume(); 

    ((Global) getActivity().getApplication()).getChannel().bind("message", messageListener); 

} 

//Make sure to unbind the event listener! 
@Override 
protected void onPause() { 
    super.onPause(); 
    ((Global) getActivity().getApplication()).getChannel().unbind("message", messageListener); 
} 

J'espère que cette aide :)

+0

Merci encore beaucoup, va essayer cette méthode –

+1

Merci beaucoup, vous avez sauvé ma journée. Cela fonctionne parfaitement. –

+1

C'est bon d'entendre ça! :) – zmarkan

1

bien si après avoir essayé pendant un certain temps j'ai tout compris moi-même j'ai créé une classe mondiale et juste ajouté le code de poussoir pour que il maintient juste une connexion pour tout le cycle de vie de l'application

public class Global extends MultiDexApplication { 

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

      SharedPreferences preferences = sharedInstance.getSharedPreferences(sharedInstance.getString(R.string.shared_preferences), Context.MODE_PRIVATE); 
      sharedInstance.preferences = preferences; 
      connectTopusher(); 


     } 

public void connectTopusher() { 
     PusherOptions options; 
     Channel channel; 
     Pusher pusher; 
     options = new PusherOptions(); 
     options.setCluster("ap2"); 
     pusher = new Pusher("afbfc1f591fd7b70190f", options); 
     pusher.connect(); 
     String profile = Global.shared().preferences.getString("PROFILE_ID", ""); 
     channel = pusher.subscribe(profile); 

     channel.bind("message", 
       new SubscriptionEventListener() { 
        @Override 
        public void onEvent(String s, String s1, final String data) { 
         new Handler(Looper.getMainLooper()).post(new Runnable() { 
          @Override 
          public void run() { 
           try { 
            JSONObject result = new JSONObject(data); 
            String message = result.getString("message"); 
            String time = result.getString("time"); 
            String reId = result.getString("recieverId"); 

           } catch (JSONException e) { 
            e.printStackTrace(); 
           } 
           System.out.println("DATA ====>>" + data); 
          } 
         }); 
        } 
       }); 


     channel.bind("status_change", new SubscriptionEventListener() { 
      @Override 
      public void onEvent(String s, String s1, final String data) { 
       new Handler(Looper.getMainLooper()).post(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          JSONObject result = new JSONObject(data); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
         System.out.println("DATA ====>>" + data); 
        } 
       }); 
      } 


     }); 


    }