Android xUtils3

xUtils3是xUtils的升级版,包含注解、联网、图片加载和数据库四大模块。注解模块简化布局初始化,联网模块支持大文件上传下载,图片模块支持多种格式及裁剪,数据库模块性能媲美greenDao。
摘要由CSDN通过智能技术生成

一、简介

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);

                    }
                });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值