MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。
- View:对应于布局文件
- Model:业务逻辑和实体模型
- Controllor:对应于Activity
- View 对应于Activity,负责View的绘制以及与用户交互
- Model 依然是业务逻辑和实体模型
- Presenter 负责完成View于Model间的交互
MVC与MVP的区别:
引入Dragger2 android {compileSdkVersion 25 buildToolsVersion "25.0.0" defaultConfig {applicationId "vko.cn.myapplication" minSdkVersion 19 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" jackOptions {enabled true } // ndk { // // 设置支持的SO库架构 // abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' // } }buildTypes {release {minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }}//使用DataBinding dataBinding {enabled = true }// 使用Java1.8, lamdba compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {exclude group: 'com.android.support', module: 'support-annotations' })compile 'com.android.support:appcompat-v7:26.+' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' // Rxjava2 + Retrofit + okHttp compile 'io.reactivex.rxjava2:rxjava:2.1.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile 'com.squareup.okhttp3:okhttp:3.8.1' //Dragger2 compile 'com.google.dagger:dagger:2.7' annotationProcessor 'com.google.dagger:dagger-compiler:2.7' provided 'javax.annotation:jsr250-api:1.0' //底部菜单 compile 'com.ashokvarma.android:bottom-navigation-bar:1.3.0' compile 'com.android.support:design:24.0.0'
buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:2.3.0' // //Dagger2 // classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //lamdba classpath 'me.tatarka:gradle-retrolambda:3.2.0' // classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.1-2" // classpath "org.jetbrains.kotlin:kotlin-android-extensions:1.0.1-2" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
/** * Created by A on 2017/9/4. */ public class InterfaceContract {public interface LoginView extends BaseView {String getUserName(); String getPassWord(); void loginSuccess(); void loginFail(); }public interface Presenter<T extends BaseActivity> {void attachView(T t); void detachView(); }public interface ILoginModule{void login(String userName , String passWord, InterfaceContract.OnLoginListener listener); }/** * presenter层 的回调 */ public interface OnLoginListener {void LoginSucess(); void LoginFail(); } }
/** * Created by A on 2017/9/4. */ public interface BaseView {void startProgress(); void stopProgress(); }
public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView {@Inject public T presenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) {supportRequestWindowFeature(Window.FEATURE_NO_TITLE); //去掉Activity上面的状态栏 getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN); super.onCreate(savedInstanceState); initPresenter(); initView(); if (Build.VERSION.SDK_INT >= 21) {View decorView = getWindow().getDecorView(); int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(option); getWindow().setStatusBarColor(Color.TRANSPARENT); }}public abstract void initPresenter(); public abstract void initView(); @Override public void startProgress() {if (!ProgressDlgUtil.isShowing()){ProgressDlgUtil.showSuccinctProgress(this,"正在验证中...",2,false,false); }}@Override public void stopProgress() {ProgressDlgUtil.dismiss(); } }
很简单,定义一个抽象的方法initPresenter();实现BaseView接口,使用泛型获取Presenter的对象,由实现它的子类做具体实现, 相信很好理解,
public class LoginActivity extends BaseActivity<LoginPresenter> implements InterfaceContract.LoginView, View.OnClickListener {private ActivityLoginBinding binding; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); }@Override public void initPresenter() {//完成依赖 DaggerLoginCompent.builder().loginModule(new LoginModule(this)).build().inject(this); }@Override public void initView() {binding = DataBindingUtil.setContentView(this, R.layout.activity_login); binding.btLogin.setOnClickListener(this); }@Override protected void onDestroy() {presenter.detachView(); super.onDestroy(); }@Override public String getUserName() {String name = binding.etUser.getText().toString().trim(); return name; }@Override public String getPassWord() {String md5PassWord = MD5Utils.md5(binding.etPwd.getText().toString().trim()).toLowerCase(); return md5PassWord; }@Override public void loginSuccess() {Intent intent = new Intent(this,MainActivity.class); startActivity(intent); finish(); }@Override public void loginFail() {Toast.makeText(this,"登陆失败",Toast.LENGTH_LONG).show(); }@Override public void onClick(View view) {presenter.login(); } }
LoginActivity继承自BaseBactivity 实现了LoginView接口,本项目才用DataBing绑定获取对象(DataBing的绑定可以自行百度,减少FindViewById的操作)。在initPresenter中
public class LoginPresenter extends BasePresenter<LoginActivity> implements InterfaceContract.OnLoginListener{// private InterfaceContract.LoginView mView; private LoginModelImple modelImple; @Inject public LoginPresenter(InterfaceContract.LoginView mView){attachView((LoginActivity) mView); modelImple = new LoginModelImple(); }public void login(){mView.startProgress(); String userword = mView.getUserName(); String passWord = mView.getPassWord(); modelImple.login(userword,passWord,this); }@Override public void LoginSucess() {mView.stopProgress(); mView.loginSuccess(); }@Override public void LoginFail() {mView.stopProgress(); mView.loginFail(); } }
同样很简单,思路也很清晰, 通过构造方法获取V层的对象,然后通过传捡来的这个对象,获取user的账号密码,在构造方法中处理化M层的对象,调用M层login()方法,处理登陆的逻辑就到了M层,我们再来看看M层的逻辑,
public class LoginModelImple implements InterfaceContract.ILoginModule{public Context context; @Override public void login(String userName, String passWord, final InterfaceContract.OnLoginListener listener) {Observable<BaseEntity<UserInfo>> observable = RetrofitFactory.builder().getService().login(userName,passWord); observable.compose(RxSchedulers.compose()).subscribe(new BaseObserver<UserInfo>(VKOApplication.getInstance()) {@Override protected void onHandleSuccess(UserInfo userInfo) {LogUtils.d(this,"登陆请求的回调-------"); LogUtils.d(this,"userInfo.getToken() = " + userInfo.getToken()); SPUtils.put(VKOApplication.getInstance(),"user_token",userInfo.getToken()); // 保存用户信息等操作 listener.LoginSucess(); }}); } }
MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。相关推荐
- 新闻APP前台和后台管理系统 MVP+Dragger2+RxJava+RetroFit
一 系统说明 该新闻资讯APP 主要是用户可以查看各种各样的新闻资讯,并且可以进行注册,登录账号,评论,收藏,取消收藏,浏览新闻,发布新闻,修改修改,删除新闻,用户管理,个人信息等操作,该APP分为前 ...
- Dagger2之应用篇(Dagger2+RxJava+Retrofit+OkHttp+MVP)-第7章
介绍 前面介绍了Dagger2,今天尝试自己的想法去应用了下,说实话很别扭,晚上睡觉思前想后这个的好处.总是有一种似懂非懂,感觉就是,让对象与对象之间产生了一中关联,多个module的provides ...
- java二次封装_基于OKhttp+Rxjava2+Retrofit进行二次封装
概述 基于Retrofit进行二次封装,优雅的初始化设置.基于Okhttp拦截器和基础缓存,封装了无网络和其他所有场景的缓存策略支持,以及频繁调用请求的丢弃策略. 特性 1.基于Retrofit的二次 ...
- 模仿开眼的视频APP,基于MVP+rxjava2+Retrofit+Dagger2+Glide+Realm+GSYVideoPlayer
EyesOpener EyesOpener,一款开眼高仿APP, 基于 MVP+rxjava2+Retrofit+![Dagger2](https://img-blog.csdn.net/201806 ...
- Android MVVM + Retrofit + OkHttp + Coroutine 协程 + Room + 组件化架构的Android应用开发规范化架构
BaseDemo 介绍 BaseDemo 是Android MVVM + Retrofit + OkHttp + Coroutine 协程 + Room + 组件化架构的Android应用开发规范化架 ...
- android retrofit入门,Android开发 retrofit入门讲解
前言 retrofit基于okhttp封装的网络请求框架,网络请求的工作本质上是 OkHttp 完成,而 retrofit 仅负责网络请求接口的封装.如果你不了解OKhttp建议你还是先了解它在来学习 ...
- 简单java登录页面android_Android 之路 - RxJava2+Retrofit实现简单登陆
原标题:Android 之路 - RxJava2+Retrofit实现简单登陆 前言 使用RxJava2+Retrofit实现简单登陆. 正文1. Hello world1.1 相关版本 Androi ...
- Retrofit+OKHttp+RxJava的使用
什么是响应式编程 响应式编程是一种基于异步数据 流概念的编程模式.数据流就像一条河:它可以被观测,被过滤,被操作,或者为新的消费者与另外一 条流合并为一条新的流. 什么是RxJava RxJava ...
- (三)Rxjava2+Retrofit之文件上传与下载
结合 第一篇文章对Retrofit的封装,本篇文章将讲述如何实现文件上传与下载.本篇文章可分为文件上传与文件下载两部分内容. 一.使用RxJava+Retrofit上传文件 使用Retrofit上传文 ...
最新文章
- Android桌面组件App Widget开发三步走
- Java中的参数传递 --Java
- 直通车运营系统优化之账户结构设置
- Bootstrap框架学习
- 在XNA 3.0 项目添加声音——播放MP3或WMA声音文件
- 组合,聚合,关联,依赖的区别
- 想加入一行代码吗?使用code标签
- 服务器内存太小,伤不起![异常与应用程序池引发的连锁命案]
- 二年级计算机考试题,二年级计算机笔测试题(XX-XX第一学期
- HTML5期末大作业:我的家乡网站设计4
- WIn10桌面美化(一)Rainmeter的使用
- 小程序随笔(关于香港手机号无法接收短信)
- 通过抓包来看http三次握手的具体细节
- 成果丰硕!SWORD 斯沃德惊艳亮相“第18届深圳名品家博会”
- raid 物理盘缓存状态_查看RAID状态
- mac android 文件管理器,PC和Mac浏览安卓手机上文件最快的方式,只需两步
- 近期工作心得(总结篇)
- 连接华为云服务中心常见问题汇总
- 西铁城s621c打印机调试说明,西铁城CL-S621CII驱动
- 从软件测试培训班出来后找工作这段时间的经历,教会了我这五件事...
热门文章
- 玩游戏用什么轴的机械键盘好_机械键盘轴哪个最适合打游戏
- 面试问烂了的测试用例: 登录界面的测试用例
- ant安装和ant的环境配置
- GHM:Gradient Harmonized Single-stage Detector
- 手机被DNS劫持后的更改方案
- python读写tif文件
- JAVA冰箱评测开题报告_基于CFD的风冷冰箱后风道数值计算和优化设计开题报告...
- 【Linux】通过Mac终端连接虚拟机(ssh root@192.168.31.230)
- STM32 (基于HAL库) 硬件IIC读写任意AT24CXX芯片
- 在湖北考取的交通类安全员B证可以调转河南省企业使用吗?