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