Project 的build.gradle配置
classpath'com.neenbedankt.gradle.plugins:android-apt:1.8'
Module 的build.gradle配置
l 顶部
applyplugin:'com.neenbedankt.android-apt'
l 依赖
//减少findViewById
compile 'com.jakewharton:butterknife:5.1.1'
项目中用来生成rv的viewholder
static classViewHolderextendsRecyclerView.ViewHolder {
@InjectView(R.id.img)
ImageView img;
@InjectView(R.id.text)
TextView text;
publicViewHolder(View itemView) {
super(itemView);
ButterKnife.inject(this, itemView);
}
}
项目中用来生成控件的初始化代码
public classMainActivityextendsAppCompatActivity {
@InjectView(R.id.hello)
TextView hello;
@InjectView(R.id.activity_main)
RelativeLayoutactivityMain;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
intlayoutId = R.layout.item;
}
@OnClick(R.id.hello)
public voidonClick() {
}
}
2. Retrofit网络请求框架
配置权限(任意的网络请求框架都要使用到)
<uses-permissionandroid:name="android.permission.INTERNET"/>
访问服务器的连接
http://10.0.2.2:8080/TakeoutService/home
>1.先配置json解析成的javaBean
com.itheima.takeout94.net.bean.ResponseInfo
public classResponseInfo {
publicStringcode;
publicStringdata;
}
>2.配置请求方法
public interfaceTakeOutApi {
//请求主页地址的方法
@GET(ApiUrls.HOME)
Call
}
>3.初始化请求方法
public classApiUrls {
//主页
public static finalStringHOME="home";
}
public classHttpUtils {
private staticTakeOutApitakeOutApi;
public staticTakeOutApi getApi() {
if(takeOutApi ==null) {
//初始化retrofit框架
Retrofit build =newRetrofit.Builder()
//1.配置主机地址
.baseUrl("http://10.0.2.2:8080/TakeoutService/")
//2.解析json的工具
.addConverterFactory(GsonConverterFactory.create(newGson()))
.build();
//读取接口上面的参数 home ==>http://10.0.2.2:8080/TakeoutService/home
takeOutApi = build.create(TakeOutApi.class);
}
returntakeOutApi;
}
}
>4.页面调用Call方法
@OnClick(R.id.hello)
public voidonClick() {
//http://localhost:8080/TakeoutService/home
Call
//Callback数据返回处理对象
//1.空方法,给开发者编写业务逻辑处理
//2.条件
SimpleCallBack callback=newSimpleCallBack(){
@Override
protected voidshowError(inti, Throwable t) {
super.showError(i, t);
Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
protected voidshowData(inti, String json) {
super.showData(i, json);
HomeData data=newGson().fromJson(json,HomeData.class);
Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_SHORT).show();
}
};
call.enqueue(callback);
}
SimpleCallBack是对CallBack的进一步封装
public classSimpleCallBackimplementsCallback
@Override
public voidonResponse(Call
ResponseInfo body = response.body();
//还可以取出转译后json
String json = body.data;
if(TextUtils.isEmpty(json)) {
showError(0,newRuntimeException("取得数据为空"));
} else {
showData(1, json);
}
}
@Override
public voidonFailure(Call
t.printStackTrace();
showError(-1, t);
}
protected voidshowError(inti, Throwable t) {
}
protected voidshowData(inti, String json) {
}
}
l HomeData是使用GsonFormat对body的进一步解析
3. OrmLite 数据库框架
基于orm设计的数据库访问框架。这种框架 可以让开发者不写sql的情况完成dao开发。
Orm:对象关系模型映射。即通过javaBean的特殊配置。完成类与表名 变量与列名的对应关系的配置。
有了这个关系可以通过框架直接把对象保存到数据库
>1.依赖
// 数据库操作工具
compile 'com.j256.ormlite:ormlite-android:5.0'
>2.完成OrmLiteOpenHelper的创建
public classMyOpenHelperextendsOrmLiteSqliteOpenHelper {
private static finalStringdatabaseName="user.db";
//OrmLiteSqliteOpenHelper:是SqliteOpenHelper子类。
private static finalSQLiteDatabase.CursorFactoryfactory=null;
private static final intdatabaseVersion=1;
publicMyOpenHelper(Context context) {
super(context,databaseName,factory,databaseVersion);
}
//TableUtils:表工具 管理表,创建表与删除表
@Override
public voidonCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
//ConnectionSource:优化为SqliteDatabase
//javaBean的字节文件
//创建表.
try{
TableUtils.createTable(connectionSource,UserInfo.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public voidonUpgrade(SQLiteDatabase database, ConnectionSource connectionSource,intoldVersion,intnewVersion) {
}
}
>3.对象关系映射
@DatabaseTable(tableName ="t_user")
public classUserInfo {
@DatabaseField(columnName ="name")
privateStringname;
@DatabaseField(columnName ="address")
privateStringaddress;
@DatabaseField(columnName ="age")
private intage;
@DatabaseField(columnName ="_id",generatedId =true)
private intid;
//有几点要求
//1.无参构造函数
//2.get与set方法
//3.配置表名 @DatabaseTable 告诉框架将来这个记录存在哪张表
//4.配置表字段@DatabaseField配置 成员变量对应的列名
//5.generatedId = true 主键,自增长
publicUserInfo() {
}
l 注意事项:
对javaBean的几点要求一步都不能少配置
4. EventBus3.0 传参框架
基于发布订阅模型的一个传参框架。
可以将任意参数(Object)传递给任意的类(activity fragment adapter service等。。。)
>1.依赖
//导入eventbus
compile 'org.greenrobot:eventbus:3.0.0'
>2.发送消息
Message msg =newMessage();
msg.what=1;
msg.obj="http://www.baidu.com.apk";
EventBus.getDefault().post(msg);
>3.接收消息
(a)以Activity为例 要求执行注册与移除方法
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//eventbus传参框架
EventBus.getDefault().register(this);
}
@Override
protected voidonDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
(b)要求接收参数的方法如下
@Subscribe(threadMode = ThreadMode.MAIN)
public voidonEvent(Message msg) {
if(msg.what==2) {
//... }
}
以上方法有几处要求
l 方法必须有@Subscribe标注
l 明确指定当前线程 threadMode = ThreadMode.MAIN 。默认threadMode = ThreadMode.POSTING,即跟post方法的线程一致
l 方法参数类型与post发送的类型一致才能接收
一点建议
l 方法建议以onEventXX命名,不强制但是比较规范
5. Dagger2依赖注入框架
1.低耦合度
类与类之间的引用关系。
一个类引用 4类
一个类引用 1类
2.工厂模式:一种设计模式,创建模式 跟new
public class FragmentFactory {
public static Fragment newFragment(int pageIndex) {
Fragment fragment = null;
switch (pageIndex) {
case 0:
fragment = new AFragment();
break;
case 1:
fragment = new BFragment();
break;
case 2:
fragment = new CFragment();
break;
case 3:
fragment = new CFragment();
break;
}
return fragment;
}
}
比较 引用
使用工厂之前
引用的类
importcom.itheima.a003dagger2.fragment.AFragment;
import com.itheima.a003dagger2.fragment.BFragment;
import com.itheima.a003dagger2.fragment.CFragment;
import com.itheima.a003dagger2.fragment.DFragment;
代码为
AFragment fragment1=new AFragment();
BFragment fragment2=new BFragment();
CFragment fragment3=new CFragment();
DFragment fragment4=new DFragment();
使用工厂之后
引用的类
importcom.itheima.a003dagger2.fragment.FragmentFactory;
importandroid.support.v4.app.Fragment;
代码为
Fragment fragment1 =FragmentFactory.newFragment(0);
Fragment fragment2 =FragmentFactory.newFragment(1);
Fragment fragment3 =FragmentFactory.newFragment(2);
Fragment fragment4 =FragmentFactory.newFragment(3);
l 结论
导入的类减少两个,说明工厂模降低了类与类之间的引用数量,即降低耦合度。
3.依赖注入
注射室。
a.注入器(包含药品的对象)
b.注入(被注入的部位)
dagger2.比较流行的依赖注入框架
dagger1.由sqaure公司开源
dagger2.由google公司开源
原理:
l 通过预编译技术生成 预编译代码
l 代码都是工厂模式
l 注入器根据@Inject变量查找对应的实例
l 如果实例合适进行赋值
>0配置apt
applyplugin:'com.neenbedankt.android-apt'
>1.依赖
//dagger
compile 'com.google.dagger:dagger:2.6'
apt 'com.google.dagger:dagger-compiler:2.6'
>2.@Inject管理实例(工厂模式 )
public classPerson {
publicStringname;
publicStringage;
@Inject
publicPerson() {
}
}
>3.@Inject指定注入位置
public classMainActivityextendsAppCompatActivity {
@Inject
Personperson;
>4.配置注入器Component
@Component
public interfaceMainActivityComponent {
voidinject(MainActivity activity);
}
5>.运行apt工具会根据注解生成 一些代码
1.通过生成预编译代码
Apt:annotation process tool 注解处理工具->注解编译工具。
>6.页面调用注入方法
DaggerMainActivityComponent
.builder().
build()//使用builder方式创建注入器DaggerMainActivityComponent必须运行run
.inject(this);//给当前页面的@Inject的变量 查找实例对象并进行注入
特点
1.注解 @Inject @Component
@Inject 类的工厂模式 对类有要求(必须在源代码的无参构造函数上 加@Inject,对于第三方库.jar)
@Module @Provides 类的工厂模式(对于第三方库 .jar不能在源代码上面加@Inject而设计)
@Module
public class MainActvityMoudle { //页面Moudle
@Provides
public UserDao provideUserDao() {//以provide开头
return new UserDao();
}
}
》1.使用@Module与@Provides配置工厂模式
@Module
public classMainActvityMoudle {
@Provides
publicUserDao provideUserDao() {
return newUserDao();
}
}
>2.配置注入器
@Component(modules = {MainActvityMoudle.class})
public interfaceMainActivityComponent {
voidinject(MainActivity activity);
}
>3.运行预编译
>4.指定元素调用注入
public classMainActivityextendsAppCompatActivity {
@Inject
UserDaouserDao2;
DaggerMainActivityComponent
.builder().
build()//使用builder方式创建注入器DaggerMainActivityComponent必须运行run
.inject(this);//给当前页面的@Inject的变量 查找实例对象并进行注入
6. MVP