热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

黑马外卖笔记(一)

1.Butterknife初始化控件框架Project的build.gradle配置classpathcom.neenbedankt.gradle.plugins:android-apt:1.

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

 

注意事项

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) {
       //...    }

}

以上方法有几处要求

方法必须有@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

 

原理:

 

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

代码都是工厂模式

注入器根据@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 注解处理工具->注解编译工具。

 

 

 

>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

 

 


推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
zc43pml
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有