不知道如何使用rxjava

时间:2016-10-31 10:32:32

标签: android rx-java

我试图在MVP模式后使用rxjava。

我研究了一个多星期但是我很难用它......可悲的是。

当用户点击MainActivity上的按钮时, onclick事件运行networkPresenter.checkConnectivity(context)。

你能告诉我在哪里可以将代码更改为rxjava吗?

提前致谢。

万圣节快乐!

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;
    }
}

1 个答案:

答案 0 :(得分:3)

关键是,rxJava将所有事件表示为数据,来自一个管道并被重定向到另一个管道。 RxBinding库将您的小部件绑定到rxJava,因此对于每个视图,您将拥有一个observable。 在MVP模式中,演示者负责逻辑本身,因此,当您在演示者中注册视图和模型时,从View中获取该Observable,订阅它并保存Subscription对象。分离视图时必须切断该订阅 - 通常在onPause()方法的presenter上调用它。并且,在onResume()中,再次在演示者中注册视图。 工作流程将如下: - Widget引发事件并将其传递给rxJava的管道(Observable)。 如果附加了View,则由Presenter监视此可观察对象。 Presenter接受该事件并处理它。如果View未在Presenter中注册,则此事件将不再发生。订阅对象表示某些管道连接到某个接收器的事实,并且当您取消订阅时,该管道会从事件源(Widget)中被切断。