应用部门的培训材料

来源:互联网 发布:美国最新经济数据今晚 编辑:程序博客网 时间:2024/05/17 04:08
  1. 引入MVP最简单的框架 最简单的代码 使用范例
    最简单的MVP的demo
    这里写图片描述

D:\360安全浏览器下载\androidmvp-master

view presenter modelt

activity 作为控制器
功能:模拟登陆
模拟数据的获取
这里写图片描述

更常见的写法

 `public interface BaseView<T> {    void setPresenter(T presenter);}`   `public interface BasePresenter {    void subscribe();    void unSubscribe();}
具体项目简单说明

D:\360安全浏览器下载\MinimalistWeather-master\app\src\main\java\com\baronzhang\android\weather

  1. 解读一个第三方的应用的框架 模块的引入重点介绍用到的第三方的框架,突出应用,即使用的方法
    这里写图片描述

  2. 重点讲解的知识点

dagger2 的简单介绍

  • annotation
    http://blog.csdn.net/mcryeasy/article/details/52740041
  • 动态代理模式

java注解详解,可以在运行时利用反射机制运行处理注解。其实,我们还可以在编译时处理注解,这就是不得不说官方为我们提供的注解处理工具APT (Annotation Processing Tool )。

APT用来在编译时期扫描处理源代码中的注解信息,我们可以根据注解信息生成一些文件,比如Java文件。利用APT为我们生成的Java代码,实现冗余的代码功能,这样就减少手动的代码输入,提升了编码效率,而且使源代码看起来更清晰简洁。

从Java5开始,JDK就自带了注解处理器APT,比如Dagger、ButterKnife、AndroidAnnotation、EventBus等。

Dagger2使用过程中我们通常接触到的注解主要包括:@Inject, @Module, @Provides, @Component, @Qulifier, @Scope, @Singleten。

@Inject:@Inject有两个作用,一是用来标记需要依赖的变量,以此告诉Dagger2为它提供依赖;二是用来标记构造函数,Dagger2通过@Inject注解可以在需要这个类实例的时候来找到这个构造函数并把相关实例构造出来,以此来为被@Inject标记了的变量提供依赖;

@Module:@Module用于标注提供依赖的类。你可能会有点困惑,上面不是提到用@Inject标记构造函数就可以提供依赖了么,为什么还需要@Module?很多时候我们需要提供依赖的构造函数是第三方库的,我们没法给它加上@Inject注解,又比如说提供以来的构造函数是带参数的,如果我们之所简单的使用@Inject标记它,那么他的参数又怎么来呢?@Module正是帮我们解决这些问题的。

@Provides:@Provides用于标注Module所标注的类中的方法,该方法在需要提供依赖时被调用,从而把预先提供好的对象当做依赖给标注了@Inject的变量赋值;

@Component:@Component用于标注接口,是依赖需求方和依赖提供方之间的桥梁。被Component标注的接口在编译时会生成该接口的实现类(如果@Component标注的接口为CarComponent,则编译期生成的实现类为DaggerCarComponent),我们通过调用这个实现类的方法完成注入;

@Qulifier:@Qulifier用于自定义注解,也就是说@Qulifier就如同Java提供的几种基本元注解一样用来标记注解类。我们在使用@Module来标注提供依赖的方法时,方法名我们是可以随便定义的(虽然我们定义方法名一般以provide开头,但这并不是强制的,只是为了增加可读性而已)。那么Dagger2怎么知道这个方法是为谁提供依赖呢?答案就是返回值的类型,Dagger2根据返回值的类型来决定为哪个被@Inject标记了的变量赋值。但是问题来了,一旦有多个一样的返回类型Dagger2就懵逼了。@Qulifier的存在正式为了解决这个问题,我们使用@Qulifier来定义自己的注解,然后通过自定义的注解去标注提供依赖的方法和依赖需求方(也就是被@Inject标注的变量),这样Dagger2就知道为谁提供依赖了。—-一个更为精简的定义:当类型不足以鉴别一个依赖的时候,我们就可以使用这个注解标示;

@Scope:@Scope同样用于自定义注解,我能可以通过@Scope自定义的注解来限定注解作用域,实现局部的单例;

@Singleton:@Singleton其实就是一个通过@Scope定义的注解,我们一般通过它来实现全局单例。但实际上它并不能提前全局单例,是否能提供全局单例还要取决于对应的Component是否为一个全局对象。

我们提到@Inject和@Module都可以提供依赖,那如果我们即在构造函数上通过标记@Inject提供依赖,有通过@Module提供依赖Dagger2会如何选择呢?具体规则如下:

步骤1:首先查找@Module标注的类中是否存在提供依赖的方法。
步骤2:若存在提供依赖的方法,查看该方法是否存在参数。
a:若存在参数,则按从步骤1开始依次初始化每个参数;
b:若不存在,则直接初始化该类实例,完成一次依赖注入。
步骤3:若不存在提供依赖的方法,则查找@Inject标注的构造函数,看构造函数是否存在参数。
a:若存在参数,则从步骤1开始依次初始化每一个参数
b:若不存在,则直接初始化该类实例,完成一次依赖注入。

参考网站
这里写链接内容

  • butterlife 原理解读
    http://blog.csdn.net/mcryeasy/article/details/52740041

“`
public class CityManagerActivity extends BaseActivity {

@BindView(R.id.toolbar)Toolbar toolbar;@InjectCityManagerPresenter cityManagerPresenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_city_manager);    ButterKnife.bind(this);    setSupportActionBar(toolbar);    if (getSupportActionBar() != null) {        getSupportActionBar().setDisplayHomeAsUpEnabled(true);        getSupportActionBar().setDisplayShowHomeEnabled(true);    }    CityManagerFragment cityManagerFragment = CityManagerFragment.newInstance(3);    ActivityUtils.addFragmentToActivity(getSupportFragmentManager(), cityManagerFragment, R.id.fragment_container);    DaggerCityManagerComponent.builder()            .applicationComponent(WeatherApplication.getInstance().getApplicationComponent())            .cityManagerModule(new CityManagerModule(cityManagerFragment))            .build().inject(this);}

}

@ActivityScoped
public final class CityManagerPresenter implements CityManagerContract.Presenter {

private CityManagerContract.View view;private CompositeSubscription subscriptions;@InjectWeatherDao weatherDao;@InjectCityManagerPresenter(Context context, CityManagerContract.View view) {    this.view = view;    this.subscriptions = new CompositeSubscription();    view.setPresenter(this);    DaggerPresenterComponent.builder()            .applicationModule(new ApplicationModule(context))            .build().inject(this);}

Android 如何编写基于编译时注解的项目
http://blog.csdn.net/lmj623565791/article/details/51931859
2,Rxjava 重点讲解几个操作符:结合几个使用场景(此时可活跃氛围)
java8 的新特性
这里写链接内容
挑lambda 链式编辑代码稍微提一下java8的新特性,完毕

这里写链接内容

三方的框架重点剖析源码 号称安卓最强大的5大框架
3,重点讲解的知识点 :
3,butterlife 原理解读
是否有时间 在进一步研究 refrofit 和DBflow

可适当强调 安卓的发展模式

as开发的网站
http://www.jcodecraeer.com/a/anzhuokaifa/Android_Studio/2015/0616/3051.html

http://stormzhang.com/

java的学习网站

http://www.mkyong.com/java/java-custom-annotations-example/

借助Stetho在Chrome上调试Android网络&数据库
http://www.jianshu.com/p/03da9f91f41f