OkGo框架
用来处理网络请求的框架 功能:上传,下载
OkGo主要功能
基本的get、post、put、delete、head、options、trace、patch八种请求
支持upString,upJson,upBytes,upFile等up类方法上传特定数据
支持一个key上传一个文件,也可以一个key上传多个文件,也可以多文件和多参数一起上传 大文件下载和下载进度回调 大文件上传和上传进度回调
支持cookie的自动管理,并可自定义cookie管理策略 支持缓存模式,不仅支持http缓存协议,也支持自定义缓存策略 支持重定向
支持自定义超时自动重连次数 支持链式调用 支持https访问,支持双向认证 支持根据tag取消请求,也可全部取消
支持自定义Callback,自动解析网络数据
首先添加依赖:
implementation ‘com.lzy.net:okgo:3.0.4’
案例效果展示
上传的文件展示
下载的文件展示
解析的字符串log输出展示
关于代码的一些问题
实现的功能:get方式下载文件,封装工具类下载json串并解析字符串,post上传MP4;
ps:其中加入了progress测试,还有glide的功能
思路:
1.首先需要封装一个工具类
(1)这个工具类需要定义一个结果接口传值
(2)这个工具类需要实现下载json串和解析的功能
(3)这个工具类非常灵活,调用时可以用任意json串
2.在xml中需要定义按钮实现效果
3.activity中需要实现具体代码
代码
xml布局中的代码
<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
<Button
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="下载文件"
/>
<Button
android:id="@+id/json"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="解析json"
/>
<Button
android:id="@+id/mp4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="上传mp4"
/>
<ProgressBar
android:id="@+id/progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
/>
<Button
android:id="@+id/imagecorner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Glide圆形圆角"
/>
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/bird"
/>
</LinearLayout>
定义的接口
package com.example.day004.Utils;
public interface Getinterface<T> {
public void success(T o);
}
实现解析的工具类
package com.example.day004.Utils;
import com.google.gson.Gson;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;
public class OkgoUtils {
public<T> void fromjson(String url, final Class c, final Getinterface getinterface){
OkGo.<String>get(url).execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
String body = response.body();
Gson gson = new Gson();
Object o = gson.fromJson(body, c);
getinterface.success((T)o);
}
});
}
}
activity中的代码
package com.example.day004;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.example.day004.Utils.Bean;
import com.example.day004.Utils.Getinterface;
import com.example.day004.Utils.Imageutils;
import com.example.day004.Utils.OkgoUtils;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.FileCallback;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Progress;
import com.lzy.okgo.model.Response;
import java.io.File;
public class MainActivity extends AppCompatActivity {
private Button image;
private Button json;
private Button mp4;
private ProgressBar progressbar;
private Button imagecorner;
private ImageView imageview;
private String url="http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=10&page=1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (Button) findViewById(R.id.image);
json = (Button) findViewById(R.id.json);
mp4 = (Button) findViewById(R.id.mp4);
progressbar = (ProgressBar) findViewById(R.id.progress);
imagecorner = (Button) findViewById(R.id.imagecorner);
imageview = (ImageView) findViewById(R.id.imageview);
//下载文件
image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
@Override
public void run() {
super.run();
String url="http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4";
OkGo.<File>get(url).execute(new FileCallback(Environment.getExternalStorageDirectory().getPath(),"abc.MP4") {
@Override
public void onSuccess(Response<File> response) {
File body = response.body();
}
//上传的进度
@Override
public void downloadProgress(Progress progress) {
super.downloadProgress(progress);
//如何拿到当前的进度
progressbar.setProgress((int) (progress.fraction*100));
}
});
}
}.start();
}
});
//解析字符串
json.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
@Override
public void run() {
super.run();
OkGo.<String>get(url).execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
OkgoUtils okgoUtils = new OkgoUtils();
okgoUtils.fromjson(url, Bean.class, new Getinterface<Bean>() {
@Override
public void success(Bean o) {
String json = o.toString();
Toast.makeText(MainActivity.this, json, Toast.LENGTH_SHORT).show();
}
});
}
});
}
}.start();
}
});
//上传mp3
mp4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
@Override
public void run() {
super.run();
OkGo.<String>post("http://169.254.152.180/test/").isMultipart(true).params("file",new File("/mnt/sdcard/hhh.mp3"),"aaa.MP3").execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
Log.d( "结果: ",response.body());
}
@Override
public void uploadProgress(Progress progress) {
super.uploadProgress(progress);
// progress.fraction*100;
}
});
}
}.start();
}
});
imagecorner.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Imageutils imageutils = new Imageutils();
imageutils.loadimage(MainActivity.this,"http://img.redocn.com/sheying/20140731/qinghaihuyuanjing_2820969.jpg",imageview);
}
});
}
}
测试用的bean类
package com.example.day004.Utils;
import java.util.List;
public class Bean {
/**
* ret : 1
* data : [{"id":"8289","title":"油焖大虾","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/9/8289.jpg","collect_num":"1668","food_str":"大虾 葱 生姜 植物油 料酒","num":1668},{"id":"2127","title":"四川回锅肉","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/3/2127.jpg","collect_num":"1590","food_str":"猪肉 青蒜 青椒 红椒 姜片","num":1590},{"id":"30630","title":"超简单芒果布丁","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/31/30630.jpg","collect_num":"1540","food_str":"QQ糖 牛奶 芒果","num":1540},{"id":"9073","title":"家常红烧鱼","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/10/9073.jpg","collect_num":"1425","food_str":"鲜鱼 姜 葱 蒜 花椒","num":1425},{"id":"10097","title":"家常煎豆腐","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/11/10097.jpg","collect_num":"1417","food_str":"豆腐 新鲜红椒 青椒 葱花 油","num":1417},{"id":"10509","title":"水煮肉片","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/11/10509.jpg","collect_num":"1340","food_str":"瘦猪肉 生菜 豆瓣酱 干辣椒 花椒","num":1340},{"id":"46968","title":"红糖苹果银耳汤","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/47/46968.jpg","collect_num":"1252","food_str":"银耳 苹果 红糖","num":1252},{"id":"10191","title":"麻婆豆腐","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/11/10191.jpg","collect_num":"1220","food_str":"豆腐 肉末 生抽 白糖 芝麻油","num":1220},{"id":"2372","title":"皮蛋瘦肉粥","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/3/2372.jpg","collect_num":"1151","food_str":"大米 皮蛋 猪肉 油条 香葱","num":1151},{"id":"2166","title":"蚂蚁上树","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/3/2166.jpg","collect_num":"1144","food_str":"红薯粉 肉 姜 蒜 花椒","num":1144}]
*/
private int ret;
private List<DataBean> data;
public int getRet() {
return ret;
}
public void setRet(int ret) {
this.ret = ret;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* id : 8289
* title : 油焖大虾
* pic : http://www.qubaobei.com/ios/cf/uploadfile/132/9/8289.jpg
* collect_num : 1668
* food_str : 大虾 葱 生姜 植物油 料酒
* num : 1668
*/
private String id;
private String title;
private String pic;
private String collect_num;
private String food_str;
private int num;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public String getCollect_num() {
return collect_num;
}
public void setCollect_num(String collect_num) {
this.collect_num = collect_num;
}
public String getFood_str() {
return food_str;
}
public void setFood_str(String food_str) {
this.food_str = food_str;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
}
额外的图片工具类
package com.example.day004.Utils;
import android.content.Context;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.example.day004.R;
/**
* Glide是图片的下载框架
*/
public class Imageutils {
public void loadimage(Context context, String url, ImageView imageView){
RequestOptions options = new RequestOptions();
options.error(R.mipmap.ic_launcher);//错误的时候显示的一张图
options.placeholder(R.mipmap.ic_launcher);//占位图
options.circleCrop();//圆形图
// RoundedCorners roundedCorners = new RoundedCorners(20);
// options.transform(roundedCorners);//圆角
Glide.with(context).load(url).apply(options).into(imageView);
}
}