MVP 学习

2017年6月7日

-------------------------------------------------- -------------------- 1通用框架方式配置完毕星级----------------------- -------------------------------------------------- -----

1概述:

原生的安卓提供了MVC的编程模式,其中活动中的业务包含两个方向:

1.1:界面业务:找控件,对界面信息校验

1.2:流程业务;

L:

五:活动,片段,布局,界面业务

工具:butterknife

病人:流程业务

工具:改造,ormlite

2.MVP的登录的例子中

2.1:V中采用了新的实例化了主持人,层与层之间互相引用造成了耦合度提高

(就是不想在V中看到P的代码新就是构造方法,就是P的代码);

2.1.1:强势理解:

这已经不是两个类这么简单,这是层与层的耦合,如果一个界面有好几个片段,他们都要用到用户的业务,势必就要创建若干个呈现对象,比如我的用户业务发生了变化,要增加一个参数,那么我就要到对应的每个界面里去修改他,耦合度太高了

2.1.2:解耦方式:

        利用配置文件,使用反射获取到需要加载的对象,这样就不用新的,本质就是单例。       

设计模式:单例,工厂,观察者......

2.2:引入Dagger2用一把刀割开他;(在传统的MVP模式下VP之间是有耦合的,引入dagger2这把刀从中间分开他们

2.2.1,什么是Dagger2?

匕首是为安卓和Java的提供平台个人文库的在compile-时进行依赖注入的框架。

编译时:关系编关系译时生成代码(rebulid),我们完成所需对象的注入(假设使用反射,应该是什么时候起作用?)。

代码执行包括编译时和运行时,反射是在运行时注入,而dagger2是在编译时执行;

2.2.2,为什么使用Dagger2?

Dagger2解决了基于反射带来的开发和性能上的问题。

3.Dagger2配置步骤:

3.1添加使用Dagger2的依赖:编译'com.google.dagger:dagger:2.6'

---------------------以下就是希望编译的时候能够生成代码所需要的配置---------------- -------

3.2在rebuild时(编译时)生成所需要的代码类路径'com.neenbedankt.gradle.plugins:android-apt:1.8' ---->在项目里配置apt

3.3在moudle中引入插件apply plugin:'com.neenbedankt.android-apt' ---->指定在那个moudle里面用apt

3.4指定生成代码的对象(为Dagger2生成代码)apt'com.google.dagger:dagger-compiler:2.6 '----->指定apt为那个生成代码这里指定的是dagger2

4.Dagger2使用步骤:

4.1在活动中注入需要的主持人

4.2在指定的类(moudule)的指定的方法(提供者)中提供演示

由于要提供演示所以需要有一个成员变量的活动,所以在弄个构造方法传进来;

4.3通过组件接口将创建实例的代码和目标关联就是解决第一个步骤中=号的问题(赋值操作)

这个注解要指定模块的的.class文件;

前面三个步骤分别解决了presenter = new presenter(this)左边,右边,和=号问题;

部件是一个动作,模块是一个模块,是前面动作需要的模块;

4.4rebuild编译生成相关代码(反射在运行时,效率低下)

4.5在需要的位置生成对应的代码(不行的话干净之后再重建,关了在开);

DaggerMainActivityComponent
      .builder()//静态方法创建静态类对象
       .mainActivityModule(new MainActivityModule(this))//调方法为成员变量module赋值
       .build()//创建component对象,初始化,创建工厂和注射器
       .in(this);//注入对象

MainActivityPresenter presenter = new MainActivityPresenter(this);

@Inject @Conponent @Module @Provides

在视法的参数里

模块提供演示者

全部的理解过程是

1.系统(根据自己写的组分)生成对应部件

2.component中(系统根据自己写的提供商生成)一个提供者提供者(把自己写的模块传进去)

3.生成注入器(把提供商传进去)

4.在在方法里调用注入器的injectMembers赋值,就是用的模块里自己写好的方法;

5。

ButterKnife工具使用

配置依赖:编译'com.jakewharton:butterknife:5.1.1'

安装插件:在插件中搜索butterknife,安装Android ButterKnife Zelezny

 6.Retrofit工具使用

一,Retorfit简介

Retorfit是一个功能强大的联网工具。可以看成是OKHttp +数据解析(JSON,XML等)的组合。

说明文档:HTTP://square.github.io/retrofit/

GitHub:https:  //github.com/square/retrofit

接口的一般规格:baseURL时+应用名+接口名+访问参数

1.引入配置

l添加Retrofit依赖:

编译  'com.squareup.retrofit2:retrofit:2.1.0'

l使用Gson进行数据解析

编译  'com.google.code.gson:gson:2.2.4'

l将Retorfit与Gson关联(看官方文档)

编译  'com.squareup.retrofit2:converter-gson:2.1.0'

2.使用步骤

1)创建Retorfit.Builder对象,通过Builder指定基本配置信息。

Retrofit.Builder builder = new Retrofit.Builder();
builder.baseUrl( “HTTP://本地主机:8080 /”);
builder.addConverterFactory(GsonConverterFactory.create());

2)通过Builder构建Retorfit对象

Retrofit retrofit = builder.build();

3)配置链接和参数

public interface ResponseInfoAPI {
  @GET(“TakeoutService / login”)
  调用<ResponseInfo> login(@Query(“username”)字符串用户名,@ Query(“password”)字符串密码);
}
注:ResponseInfo是服务器回复数据封装成的对象。

测试链接http:// localhost:8080 / TakeoutService / login?username =“itheima”&password =“bj

4)完整链接组合

ResponseInfoAPI api = retrofit.create(ResponseInfoAPI.class);

5)执行联网操作

调用<ResponseInfo> call = api.login(“itheima”,“bj”);
call.enqueue(new Callback <ResponseInfo>(){
@
Override public void onResponse(Response <ResponseInfo> response,Retrofit retrofit){
//结果处理
}
@Override
public void onFailure(Throwable throwable){
//异常处理
}
}) ;

总结改进:

1.创建构造器 - >

2.用构造器创建改型 - >

3.创建网络接口:指定请求方法(get.post,path),指定参数(让系统拼参数),起到面向接口编程的解耦性(因为需要的baseurl,servecename这些都是拼装都交给系统完成了) - >

4.用改型创建接口的实例(由系统创建,能交给系统的就由系统完成那么自己处理的少就解耦了),用实例对应接口的方法拿到返回的调用 - >

5.用呼叫的排队方法请求并传入监听器;

配置

第一步设置了主机地址baseurl,和解析方式-------------->(都一样写进BasePresenter)

绿豆可以根据返回数据的规则,写成基础豆

整个过程中只有第三步里配置了服务名,请求参数,请求类型(get / post),返回的bean -------------->针对不同请求分别单独写,

第五步里不同回调的处理方式-------------->针对不同请求分别单独写,

替换原则:

1,@ Path - 替换参数

@GET( “/组/ {ID} /用户”)

public Call <List <User >> groupList(@Path(“id”)int groupId);

2,@ Query - 添加查询参数

@GET( “/组/ {ID} /用户”)

public Call <List <User >> groupList(@Path(“id”)int groupId,@ query(“sort”)String sort);

3,@ QueryMap - 如果有多个查询参数,把它们放在地图中

@GET( “/组/ {ID} /用户”)

public Call <List <User >> groupList(@Path(“id”)int groupId,@ QueryMap Map <String,String> options);

3.Ormlite工具使用

配置

编译  'com.j256.ormlite:ormlite-android:5.0'

1.建立的javaBean与表中的字段关联起来;其中有两个要关联1.表名; 2字段名

2.创建DbHelper,同样的是在构造方法里创建数据库,在OnCreate中方法中创建表(按照1中的的javaBean建立表格);

在测试数据库的时候用applicationTest可以拿到背景

有关结连查询:以用户表和地址表为例,在地址表里面指定一列作为外键对应的变量是的UserBean指定本表中的名和引用的豆中的变量;

而对应的的UserBean中要有一个adressBean的集合的变量(注释是外部的集合);

在basePresenter抽取网络部分的时候,注意API暴露给子类用要设置成静态(公用)

-------------------------------------------------- ------------------- 1通用框架方式配置完毕端------------------------ -------------------------------------------------- ----

-------------------------------------------------- -------------------- 2例子项目的开发星级------------------------ -------------------------------------------------- ----

1.处理项目项目下面的4个点击按钮,为了表示通用性,设置ID非常麻烦(耦合强,难找),于是考虑用findchild的方式

2.使用selectorchapek

3.Fragment切换

默认首页被选中:onClick(mMainBottomeSwitcherContainer.getChildAt(0)); --->直接调回调方法

4.处理首页:入侵状态栏(比中兴的简单的多啊)

------------------------------ >>>>>>>> 注意头部要和顶部留下保证金,否则会入侵进去

需要处理4.4以下版本,4.4,5.0以上版本,创建:值-V19,值-V21

价值观:

< style  name = “AppTheme” parent = “Theme.AppCompat.Light.NoActionBar” >
</ style >

值-V19:

< style  name = “AppTheme” parent = “Theme.AppCompat.Light.NoActionBar” >
    < item  name = “android:windowTranslucentStatus” > true </ item >
    < item  name = “android:windowTranslucentNavigation” > true </ item >
< / style >

值-V21:

< style  name = “AppTheme” parent = “Theme.AppCompat.Light.NoActionBar” >
    < item  name = “android:windowTranslucentStatus” > false </ item >
    < item  name = “android:windowTranslucentNavigation” > true </ item >
    < ! - Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色 - >
    
< item name = “android:statusBarColor” > @android:color / transparent </ item >
</ style >

5.报错:没找到类“android.support.v7.widget.RecyclerView处理

compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:recyclerview-v7:24.2.1'

6.处理颜色渐变:使用ArgbEvaluator

color = (int) mEvaluator.evaluate(sum / duration, 0x553190E8, 0xFF3190E8);

7.RecyclerView对应的适配器就是创建视图(viewhold的构造方法)绑定视图(设置数据)

分析不同类型的展示

8.获取数据展示--->在业务层添加对应的方法;

8.1在responseInfoApi中添加对应的方法就是:PATH(配置baseURL时后面的部分),请求方式,参数

-------------------------------------------------- -------------------- 2例子项目的开发端------------------------ -------------------------------------------------- ----

在商品页面有关操作列表视图的项目的数据,可以在viewholder中的使用setData中把数据传入进viewholder

在适配器里的viewHolder找到父控件的其他子控件可以通过子控件的ID在uitutils里设置方法查找。

猜你喜欢

转载自blog.csdn.net/hukou6335490/article/details/72905019
MVP