黑马外卖笔记(一)

1. Butterknife初始化控件框架

Project build.gradle配置

 

classpath'com.neenbedankt.gradle.plugins:android-apt:1.8'

Module build.gradle配置

 

顶部

applyplugin:'com.neenbedankt.android-apt'

 

依赖

 

//减少findViewById
compile 'com.jakewharton:butterknife:5.1.1'

 

项目中用来生成rvviewholder

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 getHomeData();
}

 

>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 call = HttpUtils.getApi().getHomeData();
    //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 call, Response response) {
        ResponseInfo body = response.body();
        //还可以取出转译后json
        
String json = body.data;
        if(TextUtils.isEmpty(json)) {
            showError(0,newRuntimeException("取得数据为空"));
        } else {
            showData(1, json);
        }
    }
    @Override
    public voidonFailure(Call call, Throwable t) {
        t.printStackTrace();
        showError(-1, t);
    }
    protected voidshowError(inti, Throwable t) {
    }
    protected voidshowData(inti, String json) {
    }
}

 

HomeData是使用GsonFormatbody的进一步解析

 

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,int newVersion) {
    }
}

 

>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() {
    }

 

注意事项

javaBean的几点要求一步都不能少配置

 

4. EventBus3.0 传参框架

 黑马外卖笔记(一)_第1张图片

基于发布订阅模型的一个传参框架。

可以将任意参数(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) {
       //...    }

}

以上方法有几处要求

方法必须有@Subscribe标注

明确指定当前线程 threadMode = ThreadMode.MAIN 。默认threadMode = ThreadMode.POSTING,即跟post方法的线程一致

方法参数类型与post发送的类型一致才能接收

 

一点建议

 

方法建议以onEventXX命名,不强制但是比较规范

 

5. Dagger2依赖注入框架

5.1. 预备概念

 

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);

 

结论

 

导入的类减少两个,说明工厂模降低了类与类之间的引用数量,即降低耦合度。

 

 

3.依赖注入

 

注射室。

 

a.注入器(包含药品的对象)

b.注入(被注入的部位)

 

 

 

5.2. Dagger2框架介绍

 

 

dagger2.比较流行的依赖注入框架

 

dagger1.sqaure公司开源

dagger2.google公司开源

5.3. @Inject@Component

 黑马外卖笔记(一)_第2张图片

原理:

 

通过预编译技术生成 预编译代码

代码都是工厂模式

注入器根据@Inject变量查找对应的实例

如果实例合适进行赋值

 

>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 注解处理工具->注解编译工具。

 黑马外卖笔记(一)_第3张图片

 

 

>6.页面调用注入方法

 

DaggerMainActivityComponent
        .builder().
        build()//使用builder方式创建注入器DaggerMainActivityComponent必须运行run
        
.inject(this);//给当前页面的@Inject的变量 查找实例对象并进行注入

 

5.4. @Module@Provides

 

 

特点

 

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

 

 

你可能感兴趣的:(外卖笔记,Android每日必备)