Andrioid 入门-网络请求第三方框架-xUtils(原生HTTP网络访问的缺点,xUtils简介,使用方法(网络请求访问,注解(布局文件+控件+点击事件)加载网络图片))
Android 入门第六讲03-Handler(学会Debug模式断点调试,Handler机制(线程问题分析,Handler的使用方法),Handler的原理(超详细))
本讲必备代码准备
activity.java代码
public class MainActivity extends AppCompatActivity {
TextView textView1;
TextView textView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView1 = findViewById(R.id.textView);
textView2 = findViewById(R.id.textView2);
}
}
xml代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="110dp"
android:layout_marginTop="88dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="27dp"
app:layout_constraintStart_toStartOf="@+id/textView"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="111dp"
android:layout_marginLeft="111dp"
android:layout_marginTop="98dp"
android:text="Button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
</androidx.constraintlayout.widget.ConstraintLayout>
1.原生HTTP网络访问的缺点
缺点一-需要自己启动子线程
原生网络访问请求,需要自己去启动一个子线程,然后再把网络请求的代码放到这个子线程里面来执行
缺点二-拿到数据以后有UI操作 又需要切回主线程
缺点三-对于一些地址异常 各种异常还需要自己来处理(包括 数据流关闭 得到数据还得自己转String)
缺点四-如果对于一些大型应用 如果请求很多就需要自己写一个队列,放到队列中去一个一个处理,需要进行队列封装
对于这些问题,就需要把这几个问题封装起来解决,使用起来就会方便的很多,大公司可能就会自己写一套代码,但实际上 现在网上有很多开源的网络请求框架,而这些网络请求框架大部分都是会解决这些问题,所以我们用网络请求框架来访问,这些问题解决起来就得心应手了
2.xUtils简介
xUtils包含了orm, http(s), image,
view注解,但依然很轻量级(251K),并且特性强大,方便扩展.xUtil是基于Afinal开发的目前功能比较完善的一个Android开源框架,最近又发布了xUtil3.0,在增加新功能的同时又提高了框架的性能。
功能一 网络请求
其它的网络请求框架Volley、Retrofit、okHttp
http(s) :基于UrlConnection, Android4.4以后底层为okHttp实现.
- 请求协议支持11种谓词: GET,POST,PUT,PATCH,HEAD,MOVE,COPY,DELETE,OPTIONS,TRACE,CONNECT
- 支持超大文件(超过2G)上传
- 支持断点下载(如果服务端支持Range参数客户端自动处理断点下载)
- 支持cookie(实现了domain, path, expiry等特性)
- 支持缓存(实现了Cache-Control, Last-Modified, ETag等特性,缓存内容过多时使用过期时间+LRU双重机制清理
- 支持异步和同步(可结合RxJava使用)调用
其它网络访问请求框架简介
- Volley - google官方13 -已经停止更新了(曾经辉煌过,现在已经落寞了)
- Retrofit -目前最好用的网络请求框架(还可以帮助我们json解析)
- okHttp-严格来说不是一个完整的网路请求框架,它只是提供了很多底层的网络请求服务
这些框架的使用方法也都基本类似,大家可以自己去研究
功能二 网络图片加载
其它的开源框架 ImageLoader,Picasso,Glide
-
image :有了http(s)及其下载缓存的支持, image模块的实现相当的简洁.
- 支持内存缓存,磁盘缓存(缩略图和原图),并且支持回收被view持有,但被MemCache移除的图片,减少页面回退时的闪烁.
- 支持在ListView滑动时,自动停止被回收复用的item对应的下载任务(再次下载时断点续传)
- 支持webp, gif(部分比较老的系统只展示静态图)
- 支持圆角,圆形,方形等裁剪,支持自动旋转…
功能三 注解
其它的开源框架 ButterKnife、Dragger
view注解: view注解模块仅仅400多行代码却灵活的支持了各种View注入和事件绑定.
- 事件注解支持且不受混淆影.响…参考sample的混淆配置)
- 支持绑定拥有多个方法的listener
功能四 数据库
其它的开源框架LiteOrm、 GreenDao,Realm
orm :高效稳定的orm工具,使得http接口实现时更方便的支持cookie和缓存
- 灵活的,类似linq表达式的接口.
- 和greenDao- 致的性能
3.xUtils框架使用方法
第一步,导入依赖
implementation 'org.xutils:xutils:3.8.5'
第二步,添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
application 节点里添加
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
第三步,MainActivity中添加代码
x.Ext.init(getApplication());
x.Ext.setDebug(BuildConfig.DEBUG);// 是否输出debug日志, 开启debug会影响性能.
x.view().inject(this);//没有用到view注解可以先不用
1.xUtils框架网络请求访问(不带参数,不带缓存)
第一步,添加代码
RequestParams params = new RequestParams("http://148.70.46.9/object3");
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
第二步,加打印日志,检查网络访问是否成功
Log.i("Main","result"+result);
Log.i("Main","onError"+ex.getMessage());
这里我们可以在onSuccess()方法里面对文本设置值,进行UI操作,看一下会不会报错
回顾xUtils3的优点
-
框架帮助我们完成了启动子线程的操作,所以不需要我们在进行网络请求的时候自己创建启动子线程
-
拿到数据以后不需要手动切回主线程,使用框架会帮我们切回主线程
-
对于异常,框架也会帮助我们自动处理
比方说,我们把请求的地址改错,模拟一下错误,再在onError方法里对文本进行一下设置,显示网络错误,给用户一个回应
- 自带队列,x.http本身是一个单例的,它不会new很多这样的实例,那么这个单例发送的时候,他会自己帮我们把很多该封装的东西,全部放到一个队列里面,不需要我们自己来创建对列
关于xUtils3网络请求框架差不多就是这些内容,事实上,的确比我们的原生网络请求方式方便了很多,但是虽然这是一个框架,但是实际上原生请求的那些步骤框架也都实现了,只不过这些步骤都是由框架帮我们实现的,不需要我们自己去写。
2.xUitls框架注解
举个例子,比如在我们之前每次获取控件都需要findviewbyid,如果有时候需要的控件多了,写起来就会很麻烦,这里我们就可以用注解来简单实现、
1.布局文件的注解
复制代码
//替代onCreate方法中的 setContentView(R.layout.activity_main);
@ContentView(R.layout.activity_main)
如果需要导包请注意,导入带有xutils的包
2.控件的注解
@ViewInject(R.id.textView)
private TextView mTextView;
3.点击事件注解
注意:
- 方法必须私有限定,
- 方法参数形式必须和type对应的Listener接口一致.
- 注解参数value支持数组: value={id1, id2, id3}
- 其它参数说明见{@link org.xutils.event.annotation.Event}类的说明.
1.绑定一个按钮
只需添加代码
@Event(value = R.id.btn_test1,
type = View.OnClickListener.class/*可选参数, 默认是View.OnClickListener.class*/)
private void onTest1Click(View view) {
}
1.绑定多个按钮
先在布局文件再加一个button
回到activity.java
那么这里有一个问题,怎么来区分是哪一个按钮点击的呢
我们可以通过switch然后通过获取id来判断不同的按钮
@Event(value = {R.id.button,R.id.button2},//用大括号把按钮按照 R.id.格式放进去
type = View.OnClickListener.class/*可选参数, 默认是View.OnClickListener.class*/)
private void onTest1Click(View view) {
switch (view.getId()){
case R.id.button:
Log.i("button","onclick-----button1");
break;
case R.id.button2:
Log.i("button","onclick-----button2");
break;
}
}
3.xUitls框架-加载网络图片
第一步,在布局文件添加图片
<ImageView
android:id="@+id/imageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginStart="101dp"
android:layout_marginLeft="101dp"
android:layout_marginBottom="111dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
/>
第二步 ,在activity中将初始化
@ViewInject(R.id.imageView)
ImageView mImageView;
添加代码
ImageOptions imageOptions;
imageOptions = new ImageOptions.Builder()
.setSize(DensityUtil.dip2px(120), DensityUtil.dip2px(120))
.setRadius(DensityUtil.dip2px(5))
// 如果ImageView的大小不是定义为wrap_content, 不要crop.
.setCrop(true) // 很多时候设置了合适的scaleType也不需要它.
// 加载中或错误图片的ScaleType
//.setPlaceholderScaleType(ImageView.ScaleType.MATRIX)
.setImageScaleType(ImageView.ScaleType.CENTER_CROP)
.setLoadingDrawableId(R.mipmap.ic_launcher)
.setFailureDrawableId(R.mipmap.ic_launcher)
.build();
x.image().bind(mImageView, "https://5b0988e595225.cdn.sohucs.com/images/20170922/fe15d13a3e764a3bbaede340e47692ca.jpeg", imageOptions);//加载图片的控件,和加载网络图片的地址
运行
本讲关于网络请求第三方框架-xUtils的知识就讲到这里啦,学会以后是不是感觉比之前的方法方便多了,谢谢您的阅读,下一讲我们再见
Android 入门第六讲05-JSON解析第三方框架Gson(GSON框架使用方法,GSON解析Json数据(json对象,对象嵌套,数组,对象数组,json对象嵌套JSON对象数组))
博主为了可以学到更多的Android知识,创建了一个安卓知识交流群,欢迎大佬入群,当然也欢迎和我一样的安卓小白,我们可以一起交流,最重要的是快乐水群,记得定个小目标,冲击bat