xUtils3 联网模块
在做 Android 软件中,联网请求网络是必不可少的功能,xUtils3 封装了多种网络相关功能,
网络请求文本,并且可以使用 Get 或者 Post 请求文本;还支持超过 2G 大文件的下载,最满 意功能是还支持断点续传,什么是断点续传呢,就是下载一半文件后,接着原来下载的部分 接着下载文件,这样不至于重新下载,节约用户流量。 xUtils3 还支持文件上传,上传也支持大于 2G 的文件,另外录制的视频可以使用 xUtils3 上 传视频,用户头像也可以 xUtils3 上传。
1_xUtils3NetActivity 布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"><!-标题栏 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="50dp" android:background="@android:color/holo_blue_light" android:gravity="center" android:orientation="horizontal"> <TextView android:text="xUtils3 网络模块" android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white" android:textSize="20sp"/> </LinearLayout> <Button android:id="@+id/btn_get_post" android:text="get 和 pos 请求" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/btn_downloadfile" android:text="大文件下载" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/btn_uploadfile" android:text="文件上传" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv_result" android:text="显示结果" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ProgressBar android:id="@+id/progressBar" style="?android:progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
1.1 实例化布局
@ContentView(R.layout.activity_net) public class xUtils3NetActivity extends Activity { @ViewInject(R.id.tv_result) private TextView textView; @ViewInject(R.id.progressBar) private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); x.view().inject(this); } @Event(value = {R.id.btn_get_post, R.id.btn_downloadfile, R.id.btn_uploadfile}) private void getEvent(View view) { switch (view.getId()) { case R.id.btn_get_post: getDataByGet_Post(); break; case R.id.btn_downloadfile: downloadfile(); break; case R.id.btn_uploadfile: uploadfile(); break; } } }
2_使用 xUtils3 的 Get 请求文本
Get 请求,成功后会有回调,本方法是最常用的请求文本方式
private void getDataByGet_Post() { RequestParams request = new RequestParams("http://api.m.mtime.cn/PageSubArea/TrailerList.api"); x.http().get(request, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { LogUtil.e("onSuccess-result==" + result); Toast.makeText(xUtils3NetActivity.this, "result==" + result, Toast.LENGTH_SHORT).show(); textView.setText(result + ""); } @Override public void onError(Throwable ex, boolean isOnCallback) { LogUtil.e("onError==" + ex.getMessage()); } @Override public void onCancelled(CancelledException cex) { LogUtil.e("onCancelled==" + cex.getMessage()); } @Override public void onFinished() { LogUtil.e("onFinished=="); } }); }
3_使用 xUtils3 的 Post 请求文本
private void getDataByGet_Post() { RequestParams request = new RequestParams("http://api.m.mtime.cn/PageSubArea/TrailerList.api"); x.http().post(request, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { LogUtil.e("onSuccess-result==" + result); Toast.makeText(xUtils3NetActivity.this, "result==" + result, Toast.LENGTH_SHORT).show(); textView.setText(result + ""); } @Override public void onError(Throwable ex, boolean isOnCallback) { LogUtil.e("onError==" + ex.getMessage()); } @Override public void onCancelled(CancelledException cex) { LogUtil.e("onCancelled==" + cex.getMessage()); } @Override public void onFinished() { LogUtil.e("onFinished=="); } }); }
4_使用 xUtils3 文件下载&断点续传
xUtils3 支持大于 2G 的文件的下载,最惊喜的是还支持断点续传下载。
1_下载文件代码
private void downloadfile() { final RequestParams reqest = new RequestParams("http://vfx.mtime.cn/Video/2016/09/02/mp4/160902093947207009_480. mp4 "); reqest.setAutoRename(false);// 设置是否根据头信息自动命名文件 reqest.setSaveFilePath(Environment.getExternalStorageDirectory() + "/atguigu/oppo.mp4"); reqest.setExecutor(new PriorityExecutor(3, true)); // 自定义线程池 , 有效 的值范围 [1, 3], 设置为 3 时 , 可能阻塞图片加载 . reqest.setCancelFast(true); // 是否可以被立即停止 . x.http().get(reqest, new Callback.ProgressCallback<File>() { @Override public void onSuccess(File result) { LogUtil.e("onSuccess-下载文件成功" + result.toString()); } @Override public void onError(Throwable ex, boolean isOnCallback) { LogUtil.e("onError-下载文件失败" + ex.getMessage()); } @Override public void onCancelled(CancelledException cex) { LogUtil.e("onCancelled-"); } @Override public void onFinished() { LogUtil.e("onFinished-"); } @Override public void onWaiting() { LogUtil.e("onWaiting-"); } @Override public void onStarted() { LogUtil.e("onStarted-"); } @Override public void onLoading(long total, long current, boolean isDownloading) { progressBar.setMax((int) total); progressBar.setProgress((int) current); LogUtil.e("onLoading-" + current + "/" + total); } }); }
2_记得加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3_设置断点续传
下面红色的地方就是设置支持断点续传的地方
private void downloadfile() { final RequestParams reqest = new RequestParams("http://vfx.mtime.cn/Video/2016/09/02/mp4/160902093947207 009_480.mp4"); reqest.setAutoRename(false); // 设置是否根据头信息自动命名文件 reqest.setSaveFilePath(Environment.getExternalStorageDirectory() + "/atguigu/oppo.mp4"); reqest.setAutoResume(true); //设置是否在下载是自动断点续传 reqest.setExecutor(new PriorityExecutor(3, true)); // 自定义线程池 , 有效 的值范围 [1, 3], 设置为 3 时 , 可能阻塞图片加载 . reqest.setCancelFast(true);// 是否可以被立即停止 . x.http().get(reqest, new Callback.ProgressCallback<File>() { @Override public void onSuccess(File result) { LogUtil.e("onSuccess-下载文件成功" + result.toString()); } @Override public void onError(Throwable ex, boolean isOnCallback) { LogUtil.e("onError-下载文件失败" + ex.getMessage()); } @Override public void onCancelled(CancelledException cex) { LogUtil.e("onCancelled-"); } @Override public void onFinished() { LogUtil.e("onFinished-"); } @Override public void onWaiting() { LogUtil.e("onWaiting-"); } @Override public void onStarted() { LogUtil.e("onStarted-"); } @Override public void onLoading(long total, long current, boolean isDownloading) { progressBar.setMax((int) total); progressBar.setProgress((int) current); LogUtil.e("onLoading-" + current + "/" + total); } }); }
5_大文件上传
1_支持文件上传服务器的搭建
使用 tomcat 搭建服务,支持文件上传
2_文件上传
文件上传的时候也设置,上传的进度,也需要重写 ProgressCallback 这个接口
private void uploadfile() { RequestParams params = new RequestParams("http://192.168.11.215:8080/FileUpload/FileUploadServlet"); //使用 multipart 表单上传文件 params.setMultipart(true); params.addBodyParameter("file", new File(Environment.getExternalStorageDirectory() + "/atguigu/oppo.mp4"), null, "oppo.mp4"); x.http().post(params, new Callback.ProgressCallback<File>() { @Override public void onSuccess(File result) { LogUtil.e("onSuccess-上传文件成功" + result.toString()); } @Override public void onError(Throwable ex, boolean isOnCallback) { LogUtil.e("onError-下载文件失败" + ex.getMessage()); } @Override public void onCancelled(CancelledException cex) { LogUtil.e("onCancelled-"); } @Override public void onFinished() { LogUtil.e("onFinished-"); } @Override public void onWaiting() { LogUtil.e("onWaiting-"); } @Override public void onStarted() { LogUtil.e("onStarted-"); } @Override public void onLoading(long total, long current, boolean isDownloading) { progressBar.setMax((int) total); progressBar.setProgress((int) current); LogUtil.e("onLoading-" + current + "/" + total); } }); }