常用的 Android 架构(总结android架构组成)
ccwgpt 2024-09-15 15:02 28 浏览 0 评论
先列出一些常用的依赖,想必看到下面的依赖大家也能明白接下来要讲的是什么?
//所需依赖compile 'com.squareup.retrofit2:retrofit:2.1.0'compile 'io.reactivex.rxjava2:rxjava:2.0.5'compile 'io.reactivex.rxjava2:rxandroid:2.0.1'compile 'com.squareup.retrofit2:converter-gson:2.1.0'compile 'com.google.code.gson:gson:2.8.0'compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
没错,就是老生常谈的 MVP 模式。
retrofit2
作为网络请求,gson
作为json解析器。注意这里是用的最新的rxjava2
和 jakewharton 大大开源的retrofit2-rxjava2-adapter
作为桥接器。最新的版本可以前往各自的 Github 上查看。
mvp
基础架构
我个人比较喜欢在项目下新建一个 Android library 的模块,取名为core,主要作用是负责网络层和数据层。像数据实体类,数据库操作,SharedPreferences缓存,网络请求都可以放在 core 模块下,主要目的就是彻底将UI和数据层完全分开(物理层面上)。
网络模块
需要一个 RetrofitHelper
单例模块支持,主要是为 OkHttp 设置请求参数属性和初始化 Api 接口服务。
OkHttp的参数设置
OkHttp上可以设置的参数很多,像缓存,头部信息,超时时间,重连等信息都可以在 OkHttpClient 初始化设置时统一设置。
private void initOkHttp() { OkHttpClient.Builder builder = new OkHttpClient.Builder(); //设置统一的请求头部参数 builder.addInterceptor(apikey); //设置缓存 builder.addNetworkInterceptor(cacheInterceptor); builder.addInterceptor(cacheInterceptor); builder.cache(cache); //设置超时 builder.connectTimeout(10, TimeUnit.SECONDS); builder.readTimeout(20, TimeUnit.SECONDS); builder.writeTimeout(20, TimeUnit.SECONDS); //错误重连 builder.retryOnConnectionFailure(true); okHttpClient = builder.build();}
初始化项目 api 接口
一般来说,一个项目的网络返回数据都有统一的返回数据,比如有一个定义好的返回码 resultCode
,数据返回信息 resultInfo
,以及最重要的数据对象 returnObject
。所以我们需要一个类来进行网络数据套接。
public class ApiResponse<T> { private int resultCode; private T returnObject; private Object ruturnInfo; // get 和 set 方法 //...}
定义好数据类型,就轮到 Retrofit
与网络接口进行联动,首先需要一个能够定义 api 接口的地方 Apis
public interface Apis { /** * 获取启动页图片 * * @return */ @FormUrlEncoded @POST("getSplashImg") Observable<ApiResponse<SplashImageBean>> getStartImg(@Field("uid") String uid,@Field("size") String size); //其他的api ...}
之后回到 RetrofitHelper
中初始化接口服务。
// 接口服务apis = getApiService(HttpUtils.BASEURL, Apis.class);// 接口服务初始化方法private <T> T getApiService(String baseUrl, Class<T> clz) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); return retrofit.create(clz);}
搭建 MVP 架构
此方法是从 Google 的开源项目android-architecture 上的 todo?mvp?rxjava 篇演变而来。一样需要定义 View 和 Presenter 接口以及Presenter的实现,只不过加了一层 RxPresenter
对Rxjava的优化,防止内存的泄露。
MVP的基础类
首先要为mvp模式定下基础接口 BaseView
和 BasePresenter
。
Presenter 需要绑定 View 才能回调 View 里面的各种方法,所以直接在类声明的时候将 View 绑定。
同理,View 里面需要一个 Presenter 去处理数据,故定义一个 setPresenter()
方法来提醒(所以不设置也行)。
public interface BaseView { void setPresenter();}public interface BasePresenter<T extends BaseView> { void attachView(T view); void detachView();}
Rxjava 在 MVP 上的优化
之前在写 MoeMusic开源项目 的时候完全没有考虑到 Rxjava 在与 Retrofit 结合请求网络请求的时候会存在内存泄露的问题,所以在这个模块上利用 Rxjava 的订阅和取消订阅功能消除内存泄露的问题。
/*** @author cpacm* @date 2017/2/26* @desciption 可取消订阅的 rxpresenter,防止rxjava引起的内存泄露*/public abstract class RxPresenter<T extends BaseView> implements BasePresenter<T> { protected T view; protected CompositeDisposable compositeDisposable; protected void unDisposable() { if (compositeDisposable != null) { compositeDisposable.clear(); } } protected void addDisposable(Disposable disposable) { if (compositeDisposable == null) { compositeDisposable = new CompositeDisposable(); } compositeDisposable.add(disposable); } @Override public void attachView(T view) { this.view = view; } @Override public void detachView() { this.view = null; unDisposable(); }}
原理很简单,就是使用 CompositeDisposable 来订阅 rxjava 发射的事件,之后在 detachView()
解绑的时候取消订阅。
MVP 的简单使用
在使用前,我们先建一个 BaseActivity
作为所有的Activity的基类,并将其生命周期与 MVP 模块关联起来。
public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView { protected T presenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setPresenter(); if (presenter != null) { presenter.attachView(this); } } @Override protected void onDestroy() { super.onDestroy(); if (presenter != null) { presenter.detachView(); } }}
使用示例
需求:一个 app 的启动页,启动页图片来自服务器。
SplashContract
中定义各个接口要回调的方法。
public interface SplashContract { interface View extends BaseView { void showSplash(SplashImageBean bean); } interface Presenter extends BasePresenter<View> { void getSplashData(); }}
SplashPresenter
中实现网络的请求和view的回调
public class SplashPresenter extends RxPresenter<SplashContract.View> implements SplashContract.Presenter { private Apis zqswApis; public SplashPresenter() { zqswApis = RetrofitHelper.getInstance().getApis(); } @Override public void getSplashData() { Disposable disposable = zqswApis.getStartImg("","") .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Consumer<ApiResponse<SplashImageBean>>() { @Override public void accept(ApiResponse<SplashImageBean> splashImageBean) throws Exception { view.showSplash(splashImageBean.getReturnObject()); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { Log.e("cpacm", throwable.toString()); } }); addDisposable(disposable); }}
SplashActivity
实现UI完成整个需求
/*** @author cpacm* @date 2017/2/16* @desciption 启动界面*/public class SplashActivity extends BaseActivity<SplashPresenter> implements SplashContract.View { private ImageView bgView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); bgView = (ImageView) findViewById(R.id.background); presenter.getSplashData(); } @Override public void setPresenter() { presenter = new SplashPresenter(); } @Override public void showSplash(SplashImageBean bean) { Glide.with(this) .load(bean.getImageUrl()) .into(bgView); Toast.makeText(this, bean.toString(), Toast.LENGTH_SHORT).show(); }}
项目源码见下方链接
相关推荐
- NestJS入门教程系列一
-
介绍Nest(NestJS)是用于构建高效,可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,内置并完全支持TypeScript(但开发人员仍然能够使用JavaScrip...
- 【推荐】一个网盘资源搜索与转存工具,支持移动端与PC端!
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍CloudSaver是一个基于Vue3和Express的网盘资源搜索与转存开源实用工具。它支持...
- Appium原理精讲
-
目前使用Appium新版本和旧版本的企业数目都很多,而两个版本的安装过程和api的使用又有较大的区别。但是无论表面上的东东如何变化,内部原理都是一样的。在这里我给大家介绍一下appium的核心,增进大...
- Kubernetes最小部署单元Pod
-
一、Kubernetes与Pod简介在当今云计算和容器化技术盛行的时代,Kubernetes已然成为容器编排领域的中流砥柱。它是一个开源的容器编排平台,由Google基于其内部使用的Bo...
- 最常用的四种跨域解决方案
-
前置知识什么是跨域?浏览器发送的请求地址(URL)与所在页面的地址不同(端口/协议/域名其一不同)。简言之,浏览器发出的请求url,与其所在页面的url不一样。此时,同源策略会让浏览器拒收服务器...
- Bolt.New —— 全栈AI Web自动编程
-
Bolt.New是由StackBlitz公司推出的,全栈AI工具,代码编辑、运行、部署,通通一站式搞定。它使用WebContainers技术,无需任何本地安装或配置,在浏览器中,就可以运行完整的No...
- Nodejs Express新手教程&高手进阶
-
NodejsExpress新手教程&高手进阶Express是一个NodeJS平台的框架,主要用于构于Web服务器项目。本文将通过示例介绍适合新手入门的Express基础使用,以及高手进阶知识,如:c...
- Express.js 创建Node.js Web应用
-
Express.js是一个基于Node.js的Web应用框架,框架的设计目的是构建应用的架构和简化应用的开发。框架会解决一些通用的问题,在Express.js中,Express框架会处理如:中间件、代...
- JavaScript 的 Express.js 功能及应用场景详解
-
Express.js是一个基于Node.js的轻量级Web应用框架,主要用于快速构建服务器端应用和API。它的核心功能包括以下关键点:1.路由管理URL路径与HTTP方法映射:通过...
- nodejs的express4文件下载
-
在nodejs的express框架中,下载变得非常简单,就一个方法,res.download()首先express命令行生成项目基本框架:不会的看这里:http://blog.csdn.net/zz...
- Express 系列:快速生成一个项目
-
系列预告本系列将以一个项目入手结合相关技术细节来带领大家一起学习Express这个基于Node.js的后端框架。本文首先将介绍:如何快速的生成一个具有一定结构的Express项目。Express项目结...
- nodejs的express自动生成项目框架
-
nodejs版本为:4.X,express版本为4.X1.全局安装2个模块express、express-generator在命令行输入:npminstall-gexpressnpminsta...
- express开发(一)简介与搭建
-
上周末去了趟上海书城,不愧是上海数得上号的书城,流行的科技书应有尽有,话不多说直接上图。最经典的C语言O(∩_∩)O最流行的java(づ ̄3 ̄)づ超酷的R语言/(ㄒoㄒ)/~~然而,身为一个坚定的前...
- Vue+Echarts可视化大屏系统后端框架搭建(附代码)
-
各位同学,大家好。上节课,前面我们讲解了Vue+Echarts前端部分的设计方法。这节课程,我们开始讲解使用Express进行后端设计的方法。01项目相关理论介绍什么是expressExpress是...
- Shopify电商API接口开发
-
Shopify电商API接口开发上线流程主要包括以下步骤。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎洽谈合作。前期准备-注册Shopify账号:在Shopify官网注册,用于后续开发测试...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- scrapy框架 (52)
- beego框架 (42)
- java框架spring (43)
- grpc框架 (55)
- 前端框架bootstrap (42)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)