Retrofit、ButterKnife、Glide学习记录

时间: 2023-10-04 admin IT培训

Retrofit、ButterKnife、Glide学习记录

Retrofit、ButterKnife、Glide学习记录

今天是1024程序员节,发篇草稿箱里的博客庆祝下

  • Retrofit初体验
  • ButterKnife初体验
    • 配置依赖
    • 初步使用
  • Data Binding
  • Glide初体验
    • 初步使用
    • 其他配置

Retrofit初体验

这里我以请求手机号码归属地的接口为例:
:88/?app=phone.get&phone=15250881234&appkey=20584&sign=6e56a4fcbaad03fc91269c8527d2b39c&format=json
1,添加gradle依赖

 compile 'com.squareup.retrofit2:retrofit:2.1.0';compile 'com.squareup.retrofit2:converter-gson:2.1.0';compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0';

如果代码里有其他jar包或者依赖已经集成过okhttp,那么就得改成如下方式了

compile('com.squareup.retrofit2:retrofit:2.1.0'){ exclude group: 'com.squareup.okhttp3' }compile('com.squareup.retrofit2:converter-gson:2.1.0'){ exclude group: 'com.google.code.gson'exclude group: 'com.squareup.okhttp3' }compile('com.squareup.retrofit2:adapter-rxjava:2.1.0'){ exclude group: 'io.reactivex'exclude group: 'com.squareup.okhttp3' }

2,请求接口的定制

public interface RetrofitRequest {@GET("/")Call<MobileBean> getMobileArea(@QueryMap Map<String, String> params); // queryMap// 以下为非map参数
//    Call<MobileBean> getMobileArea(@Query("app") String app, @Query("phone") String phone,
//                               @Query("appkey") String appkey, @Query("sign") String sign, @Query("format") String format); // query
}

3,retrofit方法的封装

/*** url :88/?app=phone.get&phone=15250881234&appkey=20584&sign=6e56a4fcbaad03fc91269c8527d2b39c&format=json* @param phoneNum* @return*/public static String retrofitWithGet(String phoneNum){String result;Retrofit retrofit = new Retrofit.Builder().baseUrl(":88").addConverterFactory(GsonConverterFactory.create()).build();RetrofitRequest service = retrofit.create(RetrofitRequest.class);Map<String, String> params = new HashMap<String, String>();params.put("app", "phone.get");params.put("phone", phoneNum);params.put("appkey", "20584");params.put("sign", "6e56a4fcbaad03fc91269c8527d2b39c");params.put("format", "json");Call<MobileBean> callback = service.getMobileArea(params);
//      Call<MobileBean> callback = service.getMobileArea("phone.get","15250881234","20584", "6e56a4fcbaad03fc91269c8527d2b39c", "json");try {// 以下为同步方法MobileBean mobileBean = callback.execute().body();if(mobileBean.getSuccess().equals("1")) {result = mobileBean.getResult().getAtt().substring(3);}else{LogUtil.i("retrofitWithGet","出现失败");result = "江苏,淮安";}} catch (IOException e) {e.printStackTrace();LogUtil.i("retrofitWithGet","出现异常");result = "江苏,淮安";}return result;// 以下为异步方法
//      callback.enqueue(new Callback<MobileBean>() {
//          @Override
//          public void onResponse(Call<MobileBean> call, Response<MobileBean> response) {
//              MobileBean mobileBean = response.body();
//              String//              LogUtil.i("NetwotkUtils","地址:"+ area);
//
//          }
//
//          @Override
//          public void onFailure(Call<MobileBean> call, Throwable t) {
//              LogUtil.i("NetwotkUtils","retrofit请求失败"+t.getMessage());
//          }
//      });}

4,调用

retrofitWithGet("15250881234");

5,TransformException: java.util.zip.ZipException: duplicate entry: okhttp3/Address.class
此类问题的解决方法:compile Retrofit的配置加下exclude(如第一步的代码),把重复的okhttp除去。 可参考:.shtml把重复的gson包去除
bmob官方解答:.html#其它问题
和bmob使用的冲突:=52779722

ButterKnife初体验

配置依赖

根据Github上的介绍,在项目的build.gradle中添加classpath

 buildscript {repositories {mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:2.2.0'// ButterKnife 需要添加此项classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'}}

以及在module的build.gradle中添加dependencies

apply plugin: 'android-apt'dependencies {
compile 'com.jakewharton:butterknife:8.4.0'apt 'com.jakewharton:butterknife-compiler:8.4.0'
}

这样初始化配置就算完成了,下面就可以正常使用注解框架了

初步使用

详细配置请参考官方Github

 compile 'com.jakewharton:butterknife:8.4.0'apt 'com.jakewharton:butterknife-compiler:8.4.0'

1,普通的findViewById

@BindView(R.id.aboutus_version_tv)TextView versionTV;

在OnCreate中加一行代码,就可以直接使用了

    ButterKnife.bind(this);versionTV.setText("1.0")

2,View的点击事件,方法名随意

@OnClick(R.id.aboutus_protocol_layout)public void OnProtocolClick(){startActivity(new Intent(AboutActivity.this, RegisterProtocolActivity.class));}

3,Dialog的绑定

TextView qqTV = ButterKnife.findById(view, R.id.setting_qq_text);

4,去掉如下这类提示

The method xxx is Never be used

在方法上press Alt+Enter ,然后选择Suppress for methods annotated by ‘butterknife.OnClick’
至于怎么撤销这种操作,可以通过编辑.idea/misc.xml文件

   <item index="0" class="java.lang.String" itemvalue="butterknife.OnClick" />

itemvalue的值butterknife.OnClick 可以改成 butterknife.*.

5,dialog、popupwindow、pageradapter、mNavigationView的headView 如何使用BindView和OnClick注解

6,封装的RecyclerViewHolder的findViewById替换

7,控件的声明不能是private或者static的

8,普通adapter的绑定,可以通过ViewHolder的构造方法传递view参数

9,错误error如下:

Required view ‘common_title_txt’ with ID 2131624198 for field ‘mTitleTV’ was not found. If this view is optional add ‘@Nullable’ (fields) or ‘@Optional’ (methods) annotation.

首先保证butterknife.bind方法要在setContentView之后,然后在遇到有内部类的适配器时,要注意ViewHolder中的注解使用

public ViewHolder(View view) {ButterKnife.bind(this,view);}

像上面这样就可以了,不要跟我一样自作聪明的把这个this换成MainActivity.this这样。

10,ButterKnifeZelezny插件的使用

PS,混淆:

-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * { @butterknife.* <fields>;}
-keepclasseswithmembernames class * { @butterknife.* <methods>;}

Data Binding

讲完了butterknife,不得不提data binding,毕竟和下面的Glide一样属于谷歌Android团队官方出品,看它的配置就很简单,在android标签下加入如下代码

 dataBinding {enabled true}

然后布局文件要按照既定的模板格式去写,详细使用方法我也没细看,可参考这里

与此类似的注解框架还有:

  • Roboguice
  • Dagger

Glide初体验

Github地址

初步使用

使用起来也只要三步:
第一:添加依赖

compile 'com.github.bumptech.glide:glide:3.7.0'

第二:图片工具类方法

public class ImageUtils {public static void displayImage(Context context, String url, ImageView imageView) {Glide.with(context).load(url).into(imageView);}
}

第三:在合适的调用即可

其他配置

1,使用加载中图片,静态图或者动态gif

.placeholder(R.drawablemon_image_loading)

以上这个方法并不能显示动态gif,看下面

 Glide.with(context).load(url).thumbnail(Glide.with(context).load(R.drawable.image_loading)).into(imageView);

2,当使用到圆角图片时的解决方法( 相关问题点这里–>)

  • 不使用动画,鉴于Glide默认是使用动画的,如果不使用的会感觉不太好看,所以不太推荐这种做法,仅供参考
.dontAnimate()
  • 使用transform接口处理图片为圆角,可以参考
.bitmapTransform(new CropCircleTransformation(context))

3,下载图片

可以参考这篇博文,.html

4,加载本地图片,包括SD卡,资源目录下等

        Glide.with(context).load(resourceId) // R.drawable.ic_launcher//.load(file) //  /mnt/sdcard/demo.jpg.asBitmap().placeholder(R.drawablemon_image_loading) // 加载中图片.transform(new CropCircleTransformation(context))//图片显示圆形.into(imageView);

5,使用Glide加载图片变形:第一次加载变形,然后滑动列表再滑回来或者设置成centerCrop就不会变形了,出现这种问题的罪魁祸首就是placeholder,解决办法有两个:

  • 不使用placeholder
  • placeholder的图片大小设置成你最终显示图片的大小,比如说头像的话,正方形就可以了

6,图片加载失败显示的错误图

=1#comment70538329_41555443

Glide.with(context)
.load(uri)
.asBitmap()
.into(new SimpleTarget<Bitmap>(width, height) {@Overridepublic void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {// add image to the imageView hereimageView.setImageBitmap(resource);}@Overridepublic void onLoadFailed(Exception e, Drawable errorDrawable) {// you are given the error drawablesuper.onLoadFailed(e, errorDrawable);                        imageView.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.image_error));}
});

这样做了以后的确会显示加载失败的图片,但无法显示正在加载中的gif动图了