一、简介
xUtils3 是 xUtils 的升级版,功能和性能都在提高,xUtils3 主要有四大模块:注解模块,联 网模块,图片加载模块,数据库模块。
注解模块:
用于在 Activity 或者 Fragment 中初始化布局文件,便于代码更加简洁。
联网模块:
xUtils3 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词), 拥有更加灵活的 ORM,更多的事件注解支持且不受混淆影响。
图片加载模块:
加载图片很方便并且不用担心内存溢出,还可以图片绑定支持 gif(受系统兼容 性影响, 部分 gif 文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转。
数据库模块:
数据库 api 简化提高性能, 达到和 greenDao 一致的性能 。
xUtils3 的主要功能 :
1、注解
2、联网请求文本数据
3、大文件下载
4、大文件上传
5、请求图片
6、数据库模块达到和 greenDao 一致的性能
二、准备工作
下载地址: https://github.com/wyouflf/xUtils3
1、使用Gradle构建时添加一下依赖:
compile 'org.xutils:xutils:3.5.1'
2、需要添加的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3、初始化:
// 在application的onCreate中初始化
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//xUtils3初始化
x.Ext.init(this);
//是否输出debug日志, 开启debug会影响性能.
x.Ext.setDebug(BuildConfig.DEBUG);
...
}
}
添加到 AndroidManifest.xml 的<application里面:
android:name=".MyApplication"
三、注解模块
1、在Activity中使用注解初始化布局:
步骤:
1.在 Application 的 oncreate 方法中加入下面代码: x.Ext.init(this);
2.在 Activity 的 oncreate 方法中加入下面代码: x.view().inject(this);
3.加载当前的 Activity 布局需要如下注解: @ContentView 加入到 Activity 的上方
4.给 View 进行初始化需要如下注解: @InjectView
5.处理控件的各种响应事件需要如下注解: @Enven
加载布局:
@ContentView(R.layout.activity_xutils3)
public class Xutils3Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_xutils3);
x.view().inject(this);
}
}
设置按钮的监听:
@Event(value = R.id.btn_annotation)
private void getEvent(View view){
Toast.makeText(this,"注解模式被点击了",Toast.LENGTH_SHORT).show();
}
多个按钮的监听:
@Event(value = {R.id.btn_annotation,R.id.btn_net,R.id.btn_image,R.id.btn_image_list})
private void getEvent(View view){
switch (view.getId()){
case R.id.btn_annotation:
Toast.makeText(this,"注解模式被点击了",Toast.LENGTH_SHORT).show();
break;
case R.id.btn_net:
Toast.makeText(this,"网络模块被点击了",Toast.LENGTH_SHORT).show();
break;
case R.id.btn_image:
Toast.makeText(this,"加载单张图片被点击了",Toast.LENGTH_SHORT).show();
break;
case R.id.btn_image_list:
Toast.makeText(this,"加载列表图片被点击了",Toast.LENGTH_SHORT).show();
}
}
2、在Fragment中使用注解初始化布局:
步骤:
1.在 Application 的 onCreate方法中加入下面代码: x.Ext.init(this);
2.在 Fragment 的onCreateView方法中加入下面代码: x.view().inject(this,inflater,container);
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return x.view().inject(this,inflater,container);
}
3.加载当前的 Fragment 布局需要如下注解: @ContentView 加入到 Fragment 的上方
@ContentView(R.layout.activity_demo_fragment)
4.给 View 进行初始化需要如下注解: @InjectView
5.处理控件的各种响应事件需要如下注解: @Enven
例子:替换fragment:
即将被替换掉的fragment:
@ContentView(R.layout.activity_fragment_xutils)
public class FragmentXutilsActivity extends FragmentActivity {
@ViewInject(R.id.text)
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_fragment_xutils);
x.view().inject(this);
text.setText("在fragment中使用注解");
//1.得到FragmentManage
FragmentManager fm = getSupportFragmentManager();
//2.开启事务
FragmentTransaction tf = fm.beginTransaction();
//3.替换fragment
tf.replace(R.id.fragment,new DemoFragment());
//4.提交
tf.commit();
}
}
布局:
<LinearLayout
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="com.atguigu.android.atguigu.xutils3.FragmentXutilsActivity"
android:orientation="vertical">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</LinearLayout>
即将要显示的fragment :
@ContentView(R.layout.activity_demo_fragment)
public class DemoFragment extends Fragment {
@ViewInject(R.id.button)
private Button button;
@ViewInject(R.id.text)
private TextView text;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return x.view().inject(this,inflater,container);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
text.setText("我在fragment中被初始化了....");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
布局:
<LinearLayout
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"
android:orientation="vertical"
tools:context="com.atguigu.android.atguigu.xutils3.DemoFragment">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:text="text"
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
四、联网模块
1、GET请求
//get请求
RequestParams params = new RequestParams("http://api.m.mtime.cn/PageSubArea/TrailerList.api");
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
tv_result.setText(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
tv_result.setText(ex.getMessage());
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
2、POST请求
//post请求
RequestParams params = new RequestParams("http://api.m.mtime.cn/PageSubArea/TrailerList.api");
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
tv_result.setText(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
tv_result.setText(ex.getMessage());
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
3、大文件下载
RequestParams params1 = new RequestParams("http://vfx.mtime.cn/Video/2019/04/12/mp4/190412103210900661.mp4");
//设置保存路径
params1.setSaveFilePath(Environment.getExternalStorageDirectory()+"/661.mp4");
//设置是否可以立即取消下载
params1.setCancelFast(true);
//设置是否自动根据头信息命名
params1.setAutoRename(false);
x.http().get(params1, new Callback.ProgressCallback<File>() {
/**
* 当下载成功的时候回调这个方法,并且把下载到哪个路径回传过来
* @param result
*/
@Override
public void onSuccess(File result) {
Toast.makeText(XutilsNetActivity.this,"success"+result,Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Toast.makeText(XutilsNetActivity.this,"success"+ex.getMessage(),Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
@Override
public void onWaiting() {
}
@Override
public void onStarted() {
}
/**
* 设置进度条
* @param total
* @param current
* @param isDownloading
*/
@Override
public void onLoading(long total, long current, boolean isDownloading) {
progressbar.setMax((int) total);
progressbar.setProgress((int) current);
}
});
自定义线程下载,下载速度更快:
// 自定义线程池 , 有效 的值范围 [1, 3], 设置为 3 时 , 可能阻塞图片加载 .
params1.setExecutor(new PriorityExecutor(3, true));
设置断点续传:在下载的时候突然手机没电或者其他情况,再次下载的时候会继续下载,不会重新开始下载。
//设置断点续传
params1.setAutoResume(true);
4、大文件上传
RequestParams params2 = new RequestParams("http://192.168.35.11:8080/FileUpload/FileUploadServlet");
//以表单方式上传
params2.setMultipart(true);
//设置上传文件的路径
params2.addBodyParameter("File",new File(Environment.getExternalStorageDirectory()+"/661.mp4"),null,"oppo.mp4");
x.http().post(params2, new Callback.ProgressCallback<File>() {
/**
* 当下载成功的时候回调这个方法,并且把下载到哪个路径回传过来
* @param result
*/
@Override
public void onSuccess(File result) {
Toast.makeText(XutilsNetActivity.this,"success="+result,Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Toast.makeText(XutilsNetActivity.this,ex.getMessage(),Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
@Override
public void onWaiting() {
}
@Override
public void onStarted() {
}
/**
* 设置进度条
* @param total
* @param current
* @param isDownloading
*/
@Override
public void onLoading(long total, long current, boolean isDownloading) {
progressbar.setMax((int) total);
progressbar.setProgress((int) current);
}
});