2016-10-31 2 views
0

Ich versuche rxjava auf Android MVP Pattern zu verwenden.habe keine Ahnung, wie man rxjava verwendet

Ich habe mehr als eine Woche studiert, aber es ist zu schwer für mich, es zu benutzen .. leider.

Wenn Benutzer auf die Schaltfläche MainActivity klickt, wird das Ereignis onclick ausgeführt networkPresenter.checkConnectivity (Kontext).

Können Sie mir sagen, wo ich den Code zu rxjava ändern kann?

Vielen Dank im Voraus.

Fröhliches Halloween!

public class NetworkPresenter { 

    private NetworkConnector nc; 
    private MessageSetter ms; 
    private View view; 

    public NetworkPresenter(NetworkPresenter.View view) { 
     this.view = view; 
     nc = new NetworkConnector(); 
     ms = new MessageSetter(); 
    } 

    public void checkConnectivity(Context context) { 
     int connType = nc.getConnectionStatus(context); 
     view.updateReceivedMessageTextView(ms.setMessage(connType)); 
    } 

    public interface View { 
     void updateReceivedMessageTextView(String message); 
    } 
} 

.

public class NetworkConnector { 

    static final int NONE = 0; 
    static final int WIFI = 10; 
    static final int MOBILE = 20; 

    public int getConnectionStatus(Context context) { 

     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 

     int result = 0; 

     if (activeNetwork != null) { 
      if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)   result = WIFI; 
      else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) result = MOBILE; 

      if (isOnline()) return result; 
      else   return result + 1; 
     } 
     return NONE; 
    } 
} 

.

public class NetworkChecker extends Thread { 

    public static final String CONNECTION_CONFIRM_CLIENT_URL = "http://clients3.google.com/generate_204"; 
    private boolean success; 
    private String host; 

    public NetworkChecker(String host){ 
     this.host = host; 
    } 

    @Override 
    public void run() { 

     HttpURLConnection conn = null; 
     try { 
      conn = (HttpURLConnection)new URL(host).openConnection(); 
      conn.setRequestProperty("User-Agent","Android"); 
      conn.setConnectTimeout(300); 
      conn.connect(); 
      int responseCode = conn.getResponseCode(); 
      if(responseCode == 204) success = true; 
      else     success = false; 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
      success = false; 
     } 
     if(conn != null){ 
      conn.disconnect(); 
     } 
    } 

    public boolean isSuccess(){ 
     return success; 
    } 

    public static boolean isOnline() { 
     NetworkChecker cc = new NetworkChecker(CONNECTION_CONFIRM_CLIENT_URL); 
     cc.start(); 
     try{ 
      cc.join(); 
      return cc.isSuccess(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return false; 
    } 
} 

Antwort

3

Der Punkt ist, rxJava repräsentieren alle Ereignisse als Daten, aus einem Rohr kommt und an ein anderes Rohr umgeleitet wird. RxBinding-Bibliothek, um Ihre Widgets im Hinblick auf rxJava zu binden, so dass Sie für jede Ansicht eine Observable haben. In MVP ist der Moderator für die Logik selbst verantwortlich. Wenn Sie also die Ansicht und das Modell im Präsentator registrieren, nehmen Sie das Observable aus der Ansicht, abonnieren Sie es und speichern Sie das Subskriptionsobjekt. Sie müssen diese Subskription trennen, wenn die Sicht getrennt ist - normalerweise wird sie von der onPause() -Methode aufgerufen. Und registrieren Sie in onResume() erneut die Ansicht im Präsentator. Workflow wird wie folgt: - Widget raise-Ereignis und übergibt es an rxJava Pipe (Observable). Diese Observable wird von Presenter überwacht, wenn View an sie angehängt ist. Moderator nimmt dieses Ereignis und behandelt es. Falls View nicht in Presenter registriert ist, wird dieses Ereignis nicht weiter ausgeführt. Subskriptionsobjekte stellen die Tatsache dar, dass einige Pipes mit einigen Empfängern verbunden sind, und wenn sie abbestellt werden, wird diese Pipe von der Ereignisquelle (Widget) abgeschnitten.

+0

Vielen Dank für die freundliche Erklärung! –

Verwandte Themen