Android Router+RxAnroid+Retrofit2.0+OkHttp+MVP 构建项目所需框架

·  阅读 1786
原文链接: blog.csdn.net

框架

开头介绍

2016年就快结束了,这一年Android技术不断的发展,比如HotFix,React-Native,RxJava等.也是Android转型的标志吧,从2014年12月份的时候Android Studio才出0.9的beta版本,到现在2.2正式版本,开发中的插件等效率都不断在提高,从最开始的MVC架构到现在的MVP,MVVP等,所以就写了一个”3ROM”框架供大家学习和项目使用.

详细介绍

什么是Router

Router是用来控制所有的Activity跳转请求的.为什么要用Router,什么场景才会使用呢?

现在市面上大部分的APP都是首页无登录状态了,如果你没有Router你可以需要去判断每一个点击的模块是否需要登录才能使用,这样的话代码显得冗余,不易于维护,当然你说可以封装到baseActivity里面,当然也可以,但是也不是完美的.

当然Router不仅仅是控制器,也是团队开发协作的神器,为什么这样说?

因为当你的团队分配每个人写每个模块的时候,可能Activity还没有创建,但是这个时候可能就会影响你调试了.如果你使用Router就不会出现这样的问题了,你只需要配置一下跳转规则,就算没有也不会影响调试等.

如何使用Router

只需要在全局APP中的OnCreate中初始化一下:

Router.addRouteCreator(new RouterRule());

// 添加对应规则
private class RouterRule implements RouteCreator {

        @Override
        public Map createRouteRules() {
            Map rule = new HashMap<>();
            rule.put("Tanck://login", new RouteMap("com.tangce.fastcode.LoginActivity"));//类名或者类,还需要在AndroidManifest.xml配置
            return rule;
        }
    }复制代码

你可以设置Activity的拦截,这样可以解决之前说的需要登录的模块提示登录并传递数据到需要模块过去.

Router.setGlobalRouteCallback(new RouteCallback() {
            @Override
            public boolean interceptOpen(Uri uri, Context context, ActivityRouteBundleExtras extras) {
                Log.d(TAG, "interceptOpen:" + uri.toString());
                // TODO GO to LoginActivity
                return false;// false 表示不拦截
            }

            @Override
            public void notFound(Uri uri, NotFoundException e) {
                Log.d(TAG, "notFound:" + uri.toString());
            }

            @Override
            public void onOpenSuccess(Uri uri, String clzName) {

            }

            @Override
            public void onOpenFailed(Uri uri, Exception e) {

            }
        })复制代码

看了上面是不是使用很方便啊.

什么是RxAndroid

RxAndroid其实是RxJava的扩展,主要是为了应用于安卓上的线程切换.那有什么用?

其实就是非常方便链式编程,并且线程切换非常方便,这里就不做过多介绍了,有兴趣可以:给 Android 开发者的 RxJava 详解

如何使用RxAndroid

在框架中其实主要是实现就是在MVP中的Presenter了.具体如何使用后面会说的.

什么是MVP

MVP(Model View Presenter)就是抛弃了传统的MVC(Model View Control)模式,主要是将业务逻辑与View分离,这样不用将大量的业务逻辑放到Activity里面去控制,而View仅仅是更新UI即可,使得项目清晰维护简单.

如图:
MVP图

如何使用MVP

在你的Activity中继承BaseActivity即可:

public class MainActivity extends BaseActivity  {//MainPresenter主要是MainActivity的业务逻辑处理类,Object主要是与服务器交互返回的Bean类

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    MainPresenter createPresenter() {
        return new MainPresenter(this);//实现并创建自己的业务逻辑处理的类
    }

    public void login(View view) {
        Map param = new HashMap<>();
        param.put("userName", "183****3706");
        param.put("password", "******");
        param.put("imei", "422013");
        mPresenter.start(LoginApi.login(param), "1");// Tag:1
        mPresenter.start(LoginApi.login(param), "2");// Tag:2
        mPresenter.start(LoginApi.login(param), "3");// Tag:3
        mPresenter.start(LoginApi.login(param));// no Tag
    }
}复制代码

那我看看业务逻辑都做了些什么.

public class MainPresenter extends BasePresenter {

    public MainPresenter(BaseView view) {
        attachView(view);
    }

}复制代码

很简单什么都没做,什么你什么都做那你在干什么啊?

其实框架呢封装好了一些简单的方法了具体在BasePresenter了.有些什么呢?

protected  void start(Observable o) ;// 简单的无Tag的访问

protected  void start(Observable o, final String tag);// 简单的有Tag的访问,适用于当一个页面需要访问不同的网络接口的时候返回bean可能不同.

protected void cancel();//主要是用于取消http 请求等.

protected ProgressDialogCustomListener mCustomListener;//用户自己实现自己的请求网络的时候对话框复制代码

接下来就是服务器给的Response结合RxAndroid给的callback进行对应的View进行更新

public interface BaseView {
    /**
     * request network data success
     *
     * @param data
     */
    void onDataSuccess(String tag, M data);

    /**
     * request network data success
     *
     * @param data
     */
    void onDataSuccess(M data);


    /**
     * request network data fail [note:401 or 404 and so on]
     *
     * @param reason
     */
    void onDataFailed(String reason);

    /**
     * request network data fail [note:401 or 404 and so on]
     *
     * @param tag
     * @param reason
     */
    void onDataFailed(String tag, String reason);

    /**
     * no network
     */
    void onNoNetWork();

    /**
     * no network
     *
     * @param tag
     */
    void onNoNetWork(String tag);

    /**
     * finish
     */
    void onComplete();

    /**
     * finish
     *
     * @param tag
     */
    void onComplete(String tag);

    /**
     * get context
     *
     * @return
     */
    BaseActivity getContextForPresenter();

}复制代码

如果你有特殊需求,比如:每次都要处理Token或者对数据都先过滤一遍,那么使用RxJava就太简单了.

    /**
     * 用来统一处理Http的resultCode,并将HttpResult的Data部分剥离出来返回给subscriber
     *
     * @param  Subscriber真正需要的数据类型,也就是Data部分的数据类型
     */
    protected class HttpResultFunc implements Func1, M> {

        @Override
        public M call(BaseResponse baseResponse) {
//            if (baseResponse.getCode().equals("0000")) {
//                throw new ApiException(100);
//            }
            mToken = baseResponse.getToken();
            return baseResponse.getData();
        }
    }复制代码

什么是Retrofit2.0

当前的网络开源库有许多,如volley,okhttp,retrofit等,这三个库当前是比较火的,其中,okhttp和retrofit由square团队开发

关于什么是retrofit,官网文档上们有一句话。A type-safe HTTP client for Android and Java,(类型安全代码指访问被授权可以访问的内存位置。例如,类型安全代码不能从其他对象的私有字段读取值。它只从定义完善的允许方式访问类型才能读取。类型安全的代码具备定义良好的数据类型.)

而且主要是RESTful的思想在里面,Retrofit仅仅是一个框架,并不是提供访问网络,访问网络还是得OkHttp等库,而且Retrofit支持RxJava.

如何使用

创建一个类,用来专门作为NetWork API,例如登录:

public class LoginApi {

    private interface LoginService {
        @POST("csh-interface/endUser/login.jhtml")
        Observable> login(@Body Map body);
    }
 
    public static Observable> login(Map body) {

        return FastHttp.create(LoginService.class).login(body);
    }

}复制代码

什么是OKHTTP

官网的自我介绍:

HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP efficiently makes your stuff load faster and saves bandwidth.
OkHttp is an HTTP client that’s efficient by default:

? HTTP/2 support allows all requests to the same host to share a socket.
? Connection pooling reduces request latency (if HTTP/2 isn’t available).
? Transparent GZIP shrinks download sizes.
? Response caching avoids the network completely for repeat requests.
OkHttp perseveres when the network is troublesome: it will silently recover from common connection problems. If your service has multiple IP addresses OkHttp will attempt alternate addresses if the first connect fails. This is necessary for IPv4+IPv6 and for services hosted in redundant data centers. OkHttp initiates new connections with modern TLS features (SNI, ALPN), and falls back to TLS 1.0 if the handshake fails.
Using OkHttp is easy. Its request/response API is designed with fluent builders and immutability. It supports both synchronous blocking calls and async calls with callbacks.
OkHttp supportsAndroid2.3 and above. ForJava, the minimum requirement is 1.7.

概括起来说OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题

如何使用

具体使用这儿就不做过多介绍,主要是为结合Retrofit使用:

/**
     * init the retrofit and okhttp
     */
    private void init() {
        OkHttpClient.Builder okClient = getOkHttpClient();
        if (DEBUG) // is debug mode show request info 
            okClient.addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    LogUtils.d("request url:" + request.url() + "\n" + bodyToString(request.body()));
                    Response response = chain.proceed(request);
                    LogUtils.d("response:" + response.body().string());
                    return chain.proceed(request);
                }
            });
        okClient.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
        Retrofit.Builder builder = new Retrofit.Builder().client(okClient.build()).baseUrl(HttpUrl.parse(getBaseUrl()));
        mCallAdapter = getCallAdapter();
        mConverter = getConverter();
        if (null != mCallAdapter)
            builder.addCallAdapterFactory(mCallAdapter);
        if (null != mConverter)
            builder.addConverterFactory(mConverter);
        retrofit = builder.build();
    }复制代码

github:Android-FastCode

使用这个库,你可以非常简单并且快速搭建自己的项目框架.希望各位给小弟一个Star,谢谢:)

分类:
Android
标签:
分类:
Android
标签: