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>
原生网络访问请求,需要自己去启动一个子线程,然后再把网络请求的代码放到这个子线程里面来执行
缺点二-拿到数据以后有UI操作 又需要切回主线程
缺点三-对于一些地址异常 各种异常还需要自己来处理(包括 数据流关闭 得到数据还得自己转String)
缺点四-如果对于一些大型应用 如果请求很多就需要自己写一个队列,放到队列中去一个一个处理,需要进行队列封装
对于这些问题,就需要把这几个问题封装起来解决,使用起来就会方便的很多,大公司可能就会自己写一套代码,但实际上 现在网上有很多开源的网络请求框架,而这些网络请求框架大部分都是会解决这些问题,所以我们用网络请求框架来访问,这些问题解决起来就得心应手了
官方网址
xUtils包含了orm, http(s), image,
view注解,但依然很轻量级(251K),并且特性强大,方便扩展.xUtil是基于Afinal开发的目前功能比较完善的一个Android开源框架,最近又发布了xUtil3.0,在增加新功能的同时又提高了框架的性能。
其它的网络请求框架Volley、Retrofit、okHttp
http(s) :基于UrlConnection, Android4.4以后底层为okHttp实现.
其它网络访问请求框架简介
这些框架的使用方法也都基本类似,大家可以自己去研究
其它的开源框架 ImageLoader,Picasso,Glide
image :有了http(s)及其下载缓存的支持, image模块的实现相当的简洁.
其它的开源框架 ButterKnife、Dragger
view注解: view注解模块仅仅400多行代码却灵活的支持了各种View注入和事件绑定.
其它的开源框架LiteOrm、 GreenDao,Realm
orm :高效稳定的orm工具,使得http接口实现时更方便的支持cookie和缓存
第一步,导入依赖
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" />
x.Ext.init(getApplication());
x.Ext.setDebug(BuildConfig.DEBUG);// 是否输出debug日志, 开启debug会影响性能.
x.view().inject(this);//没有用到view注解可以先不用
第一步,添加代码
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的优点
框架帮助我们完成了启动子线程的操作,所以不需要我们在进行网络请求的时候自己创建启动子线程
拿到数据以后不需要手动切回主线程,使用框架会帮我们切回主线程
对于异常,框架也会帮助我们自动处理
关于xUtils3网络请求框架差不多就是这些内容,事实上,的确比我们的原生网络请求方式方便了很多,但是虽然这是一个框架,但是实际上原生请求的那些步骤框架也都实现了,只不过这些步骤都是由框架帮我们实现的,不需要我们自己去写。
举个例子,比如在我们之前每次获取控件都需要findviewbyid,如果有时候需要的控件多了,写起来就会很麻烦,这里我们就可以用注解来简单实现、
复制代码
//替代onCreate方法中的 setContentView(R.layout.activity_main);
@ContentView(R.layout.activity_main)
@ViewInject(R.id.textView)
private TextView mTextView;
注意:
- 方法必须私有限定,
- 方法参数形式必须和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;
}
}
<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"
/>
@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对象数组))