Andrioid 入门第六讲04-网络请求第三方框架-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" />

在这里插入图片描述
第三步,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.点击事件注解

注意:

    1. 方法必须私有限定,
    1. 方法参数形式必须和type对应的Listener接口一致.
    1. 注解参数value支持数组: value={id1, id2, id3}
    1. 其它参数说明见{@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的知识就讲到这里啦,学会以后是不是感觉比之前的方法方便多了,谢谢您的阅读,下一讲我们再见

猜你喜欢

转载自blog.csdn.net/qq_46526828/article/details/107511014
今日推荐