okhttp封装工具类

一.封装okhttp工具

将okhttp的相同代码进行封装,简化代码,便捷使用

public class MyokHttpUtils {
    private OkHttpClient client;
    private static MyokHttpUtils myokHttpUtils = new MyokHttpUtils();

    private MyokHttpUtils() {
        client = new OkHttpClient.Builder()
                .connectTimeout(60 * 1000, TimeUnit.SECONDS)//连接超时时间
                .readTimeout(60 * 1000, TimeUnit.SECONDS)//读取超时时间
                .writeTimeout(60 * 1000, TimeUnit.SECONDS)//写入超时时间
                .build();
    }

    private Handler handler = new Handler();

    public static MyokHttpUtils getInstance() {
        if (myokHttpUtils == null) {
            myokHttpUtils = new MyokHttpUtils();
        }
        return myokHttpUtils;
    }
}

因为只需要一个Client对象即可,所以在构造时创建Client对象,往后的方法直接调用这个对象

之后声明成员变量Handler,方便在主线程中吐司,更新UI等操作

在Activity中获取数据,用接口回调的方式

创建一个接口,用来获取请求到的数据

public interface MyokHttpCallBack {
    public void onError(String message);
    public void onOk(String json);
}

二.封装方法

1.get请求

public void doGet(String url, final MyokHttpCallBack myokHttpCallBack) {
    Request request = new Request.Builder()
            .url(url)
            .get()
            .build();
    Call call = client.newCall(request);

    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            final String message = e.getMessage();
            if (myokHttpCallBack != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        myokHttpCallBack.onError(message);
                    }
                });
            }
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String json = response.body().string();
            if (myokHttpCallBack != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        myokHttpCallBack.onOk(json);
                    }
                });
            }
        }
    });
}

Activity中调用

private String Url = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1";
private void doGet() {
    httpUtils = MyokHttpUtils.getInstance();
    httpUtils.doGet(Url, new MyokHttpCallBack() {
        @Override
        public void onError(String message) {
            Toast.makeText(MainActivity.this, ""+message, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onOk(String json) {
            Toast.makeText(MainActivity.this, ""+json, Toast.LENGTH_SHORT).show();
        }
    });
}

2.form_post请求

public void doPost(String Url, HashMap<String, String> map, final MyokHttpCallBack myokHttpCallBack) {
    FormBody.Builder builder = new FormBody.Builder();
    Set<Map.Entry<String, String>> entries = map.entrySet();
    for (Map.Entry<String, String> entrie : entries) {
        builder.add(entrie.getKey(), entrie.getValue());
    }

    FormBody formBody = builder.build();

    Request request = new Request.Builder()
            .url(Url)
            .post(formBody)
            .build();

    Call call = client.newCall(request);

    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            final String message = e.getMessage();
            if (myokHttpCallBack != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        myokHttpCallBack.onError(message);
                    }
                });
            }
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String json = response.body().string();
            if (myokHttpCallBack != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        myokHttpCallBack.onOk(json);
                    }
                });
            }
        }
    });
}

Activity中调用

private String Url_login = "https://www.wanandroid.com/user/login";
private void doPost_login() {
    httpUtils = MyokHttpUtils.getInstance();
    HashMap<String, String> map = new HashMap<>();
    map.put("username","xiabei");
    map.put("password","123456");
    httpUtils.doPost(Url_login, map, new MyokHttpCallBack() {
        @Override
        public void onError(String message) {
            Toast.makeText(MainActivity.this, ""+message, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onOk(String json) {
            Toast.makeText(MainActivity.this, ""+json, Toast.LENGTH_SHORT).show();
        }
    });
}

3.json_post请求

public void doPost(String Url, String s, final MyokHttpCallBack myokHttpCallBack) {
    RequestBody body = RequestBody.create(MediaType.parse("application/json"), s);

    Request request = new Request.Builder()
            .url(Url)
            .post(body)
            .build();

    Call call = client.newCall(request);

    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            final String message = e.getMessage();
            if (myokHttpCallBack != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        myokHttpCallBack.onError(message);
                    }
                });
            }
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String json = response.body().string();
            if (myokHttpCallBack != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        myokHttpCallBack.onOk(json);
                    }
                });
            }
        }
    });
}

Activity中调用

private String Url_video = "http://172.81.227.127:8055/videovalues/selrecommendvideos";
private void doPost_video() {
    httpUtils = MyokHttpUtils.getInstance();
    HashMap<String, String> map = new HashMap<>();
    map.put("page","0");
    map.put("userId","0");
    String s = new Gson().toJson(map);
    httpUtils.doPost(Url_video, s, new MyokHttpCallBack() {
        @Override
        public void onError(String message) {
            Toast.makeText(MainActivity.this, ""+message, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onOk(String json) {
            Toast.makeText(MainActivity.this, ""+json, Toast.LENGTH_SHORT).show();
        }
    });
}

4.get_网络下载

public void doDownload(String url, final String file_path, final MyokHttpFileCallBack myokHttpFileCallBack) {
    Request request = new Request.Builder()
            .url("http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4")//请求地址
            .get()//请求方式
            .build();
    Call call = client.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, final IOException e) {//请求失败
            final String message = e.getMessage();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    if (myokHttpFileCallBack != null) {
                        myokHttpFileCallBack.onError(message);
                    }
                }
            });
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {//请求成功
            InputStream is = response.body().byteStream();//将response转化为输入流
            FileOutputStream fos = new FileOutputStream(file_path);
            byte[] bys = new byte[1024];
            int len = 0;
            int count = 0;//记录下载的总量
            long l = response.body().contentLength();//获取需要下载的总量
            while ((len = is.read(bys)) != -1) {
                fos.write(bys, 0, len);
                count += len;
                final int progress = (int) (count * 100 / l);//获取百分比
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (myokHttpFileCallBack != null) {
                            myokHttpFileCallBack.onPrograss(progress);
                        }
                    }
                });
            }
            handler.post(new Runnable() {
                @Override
                public void run() {
                    if (myokHttpFileCallBack != null) {
                        myokHttpFileCallBack.onOk("下载完成");
                    }
                }
            });
        }
    });
}

Activity中调用

private String Url_download = "http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4";
private void doGet_downLoad() {
    httpUtils = MyokHttpUtils.getInstance();
    httpUtils.doDownload(Url_download, "/sdcard/Download/houzi.mp4", new MyokHttpFileCallBack() {
        @Override
        public void onError(String message) {
            Toast.makeText(MainActivity.this, "" + message, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onOk(String json) {
            Toast.makeText(MainActivity.this, "" + json, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPrograss(int prograss) {
            pb.setProgress(prograss);
        }
    });
}

5.Interceptor拦截器

在创建Client时添加拦截器,就可以log中看到实现过程
首先要添加拦截器的依赖

implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'// log拦截器依赖
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
client = new OkHttpClient.Builder()
        .connectTimeout(60 * 1000, TimeUnit.SECONDS)//连接超时时间
        .readTimeout(60 * 1000, TimeUnit.SECONDS)//读取超时时间
        .writeTimeout(60 * 1000, TimeUnit.SECONDS)//写入超时时间
        .addInterceptor(httpLoggingInterceptor)
        .build();

三.MVC模式

在原有的基础上改变为MVC模式
M为Model在这层请求网络数据等,
V为View视图,
C为Controller控制

首先要创建Model,以及其实现类,在实现类中调用工具类中的方法
get获取Json的model

public interface JsonModel {
    void getJson(MyokHttpCallBack myokHttpCallBack);
}
public class JsonModelImpl implements JsonModel {
    private String Url = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1";

    @Override
    public void getJson(MyokHttpCallBack myokHttpCallBack) {
        MyokHttpUtils httpUtils = MyokHttpUtils.getInstance();
        httpUtils.doGet(Url, myokHttpCallBack);
    }
}

post获取User的Model

public interface UserModel {
    void login(String username, String password, MyokHttpCallBack myokHttpCallBack);
}
public class UserModelImpl implements UserModel {
    private String Url_login = "https://www.wanandroid.com/user/login";

    @Override
    public void login(String username, String password, MyokHttpCallBack myokHttpCallBack) {
        MyokHttpUtils httpUtils = MyokHttpUtils.getInstance();
        HashMap<String, String> map = new HashMap<>();
        map.put("username", username);
        map.put("password", password);
        httpUtils.doPost(Url_login, map, myokHttpCallBack);
    }
}

post获取短视频列表的Model

public interface VideoModel {
    void getVideo(String json, MyokHttpCallBack myokHttpCallBack);
}
public class VideoModelImpl implements VideoModel {
    private String Url_video = "http://172.81.227.127:8055/videovalues/selrecommendvideos";

    @Override
    public void getVideo(String json, MyokHttpCallBack myokHttpCallBack) {
        MyokHttpUtils httpUtils = MyokHttpUtils.getInstance();
        httpUtils.doPost(Url_video, json, myokHttpCallBack);
    }
}

在原有的callback接口的onOk方法添加一个参数,用来分辨是哪一种请求

public interface MyokHttpCallBack {
    public void onError(String message);
    public void onOk(String json,int Type);
}

自定义的常量标识

public class OnOkCallBackFinal {
    public static int JSON = 1;
    public static int USER_LOGIN = 2;
    public static int VIDEO_GET = 3;
}

最终完全的工具类

public class MyokHttpUtils {
    private OkHttpClient client;
    private static MyokHttpUtils myokHttpUtils = new MyokHttpUtils();

    private MyokHttpUtils() {
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        client = new OkHttpClient.Builder()
                .connectTimeout(60 * 1000, TimeUnit.SECONDS)//连接超时时间
                .readTimeout(60 * 1000, TimeUnit.SECONDS)//读取超时时间
                .writeTimeout(60 * 1000, TimeUnit.SECONDS)//写入超时时间
                .addInterceptor(httpLoggingInterceptor)
                .build();
    }

    private Handler handler = new Handler();

    public static MyokHttpUtils getInstance() {
        if (myokHttpUtils == null) {
            myokHttpUtils = new MyokHttpUtils();
        }
        return myokHttpUtils;
    }

    public void doGet(String url, final MyokHttpCallBack myokHttpCallBack) {
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        Call call = client.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                if (myokHttpCallBack != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            myokHttpCallBack.onError(message);
                        }
                    });
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String json = response.body().string();
                if (myokHttpCallBack != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            myokHttpCallBack.onOk(json, OnOkCallBackFinal.JSON);
                        }
                    });
                }
            }
        });
    }

    public void doPost(String Url, HashMap<String, String> map, final MyokHttpCallBack myokHttpCallBack) {
        FormBody.Builder builder = new FormBody.Builder();
        Set<Map.Entry<String, String>> entries = map.entrySet();
        for (Map.Entry<String, String> entrie : entries) {
            builder.add(entrie.getKey(), entrie.getValue());
        }

        FormBody formBody = builder.build();

        Request request = new Request.Builder()
                .url(Url)
                .post(formBody)
                .build();

        Call call = client.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                if (myokHttpCallBack != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            myokHttpCallBack.onError(message);
                        }
                    });
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String json = response.body().string();
                if (myokHttpCallBack != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            myokHttpCallBack.onOk(json,OnOkCallBackFinal.USER_LOGIN);
                        }
                    });
                }
            }
        });
    }

    public void doPost(String Url, String s, final MyokHttpCallBack myokHttpCallBack) {
        RequestBody body = RequestBody.create(MediaType.parse("application/json"), s);

        Request request = new Request.Builder()
                .url(Url)
                .post(body)
                .build();

        Call call = client.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                if (myokHttpCallBack != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            myokHttpCallBack.onError(message);
                        }
                    });
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String json = response.body().string();
                if (myokHttpCallBack != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            myokHttpCallBack.onOk(json,OnOkCallBackFinal.VIDEO_GET);
                        }
                    });
                }
            }
        });
    }

    public void doDownload(String url, final String file_path, final MyokHttpFileCallBack myokHttpFileCallBack) {
        Request request = new Request.Builder()
                .url("http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4")//请求地址
                .get()//请求方式
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {//请求失败
                final String message = e.getMessage();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (myokHttpFileCallBack != null) {
                            myokHttpFileCallBack.onError(message);
                        }
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {//请求成功
                InputStream is = response.body().byteStream();//将response转化为输入流
                FileOutputStream fos = new FileOutputStream(file_path);
                byte[] bys = new byte[1024];
                int len = 0;
                int count = 0;//记录下载的总量
                long l = response.body().contentLength();//获取需要下载的总量
                while ((len = is.read(bys)) != -1) {
                    fos.write(bys, 0, len);
                    count += len;
                    final int progress = (int) (count * 100 / l);//获取百分比
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            if (myokHttpFileCallBack != null) {
                                myokHttpFileCallBack.onPrograss(progress);
                            }
                        }
                    });
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (myokHttpFileCallBack != null) {
                            myokHttpFileCallBack.onOk("下载完成");
                        }
                    }
                });
            }
        });
    }

}

及Activity代码
Activity实现了CallBack的结果接口,type用来分辨是哪种请求

public class MainActivity extends AppCompatActivity implements View.OnClickListener, MyokHttpCallBack {
    private String Url_download = "http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4";
    private MyokHttpUtils httpUtils;
    private Button get;
    private Button postFormLogin;
    private Button postJsonLogin;
    private Button butDownload;
    private ProgressBar pb;

    private JsonModel jsonModel;
    private UserModel userModel;
    private VideoModel videoModel;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
            }, 101);
        }

        initViews();
    }

    private void initViews() {
        get = (Button) findViewById(R.id.get);
        postFormLogin = (Button) findViewById(R.id.post_form_login);
        postJsonLogin = (Button) findViewById(R.id.post_json_login);
        butDownload = (Button) findViewById(R.id.but_download);
        pb = (ProgressBar) findViewById(R.id.pb);

        get.setOnClickListener(this);
        postFormLogin.setOnClickListener(this);
        postJsonLogin.setOnClickListener(this);
        butDownload.setOnClickListener(this);

        jsonModel = new JsonModelImpl();
        userModel = new UserModelImpl();
        videoModel = new VideoModelImpl();
    }

    private void doGet_downLoad() {
        httpUtils = MyokHttpUtils.getInstance();
        httpUtils.doDownload(Url_download, "/sdcard/Download/houzi.mp4", new MyokHttpFileCallBack() {
            @Override
            public void onError(String message) {
                Toast.makeText(MainActivity.this, "" + message, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onOk(String json) {
                Toast.makeText(MainActivity.this, "" + json, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPrograss(int prograss) {
                pb.setProgress(prograss);
            }
        });
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.get:
                jsonModel.getJson(this);
                break;
            case R.id.but_download:
                doGet_downLoad();
                break;
            case R.id.post_form_login:
                userModel.login("xiabei", "123456", this);
                break;
            case R.id.post_json_login:
                HashMap<String, String> map = new HashMap<>();
                map.put("page", "0");
                map.put("userId", "0");
                String s = new Gson().toJson(map);
                videoModel.getVideo(s, this);
                break;
        }
    }

    @Override
    public void onError(String message) {
        Toast.makeText(this, "" + message, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onOk(String json, int type) {
        if (type == OnOkCallBackFinal.JSON) {
            Toast.makeText(this, "" + json, Toast.LENGTH_SHORT).show();
        } else if (type == OnOkCallBackFinal.USER_LOGIN) {
            Toast.makeText(this, "" + json, Toast.LENGTH_SHORT).show();
        } else if (type == OnOkCallBackFinal.VIDEO_GET) {
            Toast.makeText(this, "" + json, Toast.LENGTH_SHORT).show();
        }
    }
}

四.小案例

利用MVC模式+okHttpUtils完成

  1. 实现登陆
  2. 登陆后获取短视频用列表展示
  3. 点击item实现跳转播放短视频
  4. 可下载到本地进度条展示

界面等用的昨天界面不做展示

首先有User和Viedo的model

public interface UserModel {
    void login(String username, String password, MyokHttpCallBack myokHttpCallBack);
}
public class UserModelImpl implements UserModel {
    private String Url_login = "https://www.wanandroid.com/user/login";

    @Override
    public void login(String username, String password, MyokHttpCallBack myokHttpCallBack) {
        MyokHttpUtils httpUtils = MyokHttpUtils.getInstance();
        HashMap<String, String> map = new HashMap<>();
        map.put("username", username);
        map.put("password", password);
        httpUtils.doPost(Url_login, map, myokHttpCallBack);
    }
}

public interface VideoModel {
    void getVideo(String json, MyokHttpCallBack myokHttpCallBack);
}
public class VideoModelImpl implements VideoModel {
    private String Url_video = "http://172.81.227.127:8055/videovalues/selrecommendvideos";

    @Override
    public void getVideo(String json, MyokHttpCallBack myokHttpCallBack) {
        MyokHttpUtils httpUtils = MyokHttpUtils.getInstance();
        httpUtils.doPost(Url_video, json, myokHttpCallBack);
    }
}

然后是请求成功的回调接口及文件下载的回调接口

public interface MyokHttpCallBack {
    public void onError(String message);
    public void onOk(String json, int Type);
}
public interface MyokHttpFileCallBack {
    public void onError(String message);
    public void onOk(String json);
    public void onPrograss(int prograss);
}
public class OnOkCallBackFinal {
    public static int JSON = 1;
    public static int USER_LOGIN = 2;
    public static int VIDEO_GET = 3;
}

okhtppUtils类

public class MyokHttpUtils {
    private OkHttpClient client;
    private static MyokHttpUtils myokHttpUtils = new MyokHttpUtils();

    private MyokHttpUtils() {
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        client = new OkHttpClient.Builder()
                .connectTimeout(60 * 1000, TimeUnit.SECONDS)//连接超时时间
                .readTimeout(60 * 1000, TimeUnit.SECONDS)//读取超时时间
                .writeTimeout(60 * 1000, TimeUnit.SECONDS)//写入超时时间
                .addInterceptor(httpLoggingInterceptor)
                .build();
    }

    private Handler handler = new Handler();

    public static MyokHttpUtils getInstance() {
        if (myokHttpUtils == null) {
            myokHttpUtils = new MyokHttpUtils();
        }
        return myokHttpUtils;
    }
    public void doPost(String Url, HashMap<String, String> map, final MyokHttpCallBack myokHttpCallBack) {
        FormBody.Builder builder = new FormBody.Builder();
        Set<Map.Entry<String, String>> entries = map.entrySet();
        for (Map.Entry<String, String> entrie : entries) {
            builder.add(entrie.getKey(), entrie.getValue());
        }

        FormBody formBody = builder.build();

        Request request = new Request.Builder()
                .url(Url)
                .post(formBody)
                .build();

        Call call = client.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                if (myokHttpCallBack != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            myokHttpCallBack.onError(message);
                        }
                    });
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String json = response.body().string();
                if (myokHttpCallBack != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            myokHttpCallBack.onOk(json,OnOkCallBackFinal.USER_LOGIN);
                        }
                    });
                }
            }
        });
    }

    public void doPost(String Url, String s, final MyokHttpCallBack myokHttpCallBack) {
        RequestBody body = RequestBody.create(MediaType.parse("application/json"),s);

        Request request = new Request.Builder()
                .url(Url)
                .post(body)
                .build();

        Call call = client.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                if (myokHttpCallBack != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            myokHttpCallBack.onError(message);
                        }
                    });
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String json = response.body().string();
                if (myokHttpCallBack != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            myokHttpCallBack.onOk(json,OnOkCallBackFinal.VIDEO_GET);
                        }
                    });
                }
            }
        });
    }

    public void doDownload(String url, final String file_path, final MyokHttpFileCallBack myokHttpFileCallBack) {
        Request request = new Request.Builder()
                .url(url)//请求地址
                .get()//请求方式
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {//请求失败
                final String message = e.getMessage();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (myokHttpFileCallBack != null) {
                            myokHttpFileCallBack.onError(message);
                        }
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {//请求成功
                InputStream is = response.body().byteStream();//将response转化为输入流
                FileOutputStream fos = new FileOutputStream(file_path);
                byte[] bys = new byte[1024];
                int len = 0;
                int count = 0;//记录下载的总量
                long l = response.body().contentLength();//获取需要下载的总量
                while ((len = is.read(bys)) != -1) {
                    fos.write(bys, 0, len);
                    count += len;
                    final int progress = (int) (count * 100 / l);//获取百分比
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            if (myokHttpFileCallBack != null) {
                                myokHttpFileCallBack.onPrograss(progress);
                            }
                        }
                    });
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (myokHttpFileCallBack != null) {
                            myokHttpFileCallBack.onOk("下载完成");
                        }
                    }
                });
            }
        });
    }

}

登陆的Activity

public class LoginActivity extends AppCompatActivity {
    private EditText etUsername;
    private EditText etPassword;
    private Button butLogin;
    private UserModel userModel;

    private String login_url = "https://www.wanandroid.com/user/login";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_login);

        initViews();
    }

    private void initViews() {
        etUsername = (EditText) findViewById(R.id.et_username);
        etPassword = (EditText) findViewById(R.id.et_password);
        butLogin = (Button) findViewById(R.id.but_login);
        userModel = new UserModelImpl();


        butLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                userModel.login(etUsername.getText().toString(), etPassword.getText().toString(), new MyokHttpCallBack() {
                    @Override
                    public void onError(String message) {
                        Toast.makeText(LoginActivity.this, "" + message, Toast.LENGTH_SHORT).show();
                    }
                    @Override
                    public void onOk(String json, int Type) {
                        if (json.indexOf("0") != -1) {
                            Toast.makeText(LoginActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();
                            startActivity(new Intent(LoginActivity.this, VideoActivity.class));
                        } else {
                            Toast.makeText(LoginActivity.this, "登陆失败,用户名或密码不正确", Toast.LENGTH_SHORT).show();
                        }
                    }

                });
            }

        });
    }
}

获取短视频的Activity

public class VideoActivity extends AppCompatActivity {
    private GridView gvShow;

    private Handler handler = new Handler();
    private List<VideoEntity> datas = new ArrayList<>();
    private MyAdapter myAdapter;
    private VideoModel videoModel;

    private String url_video = "http://172.81.227.127:8055/videovalues/selrecommendvideos";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_video);

        initViews();
        initDatas();
    }

    private void initDatas() {
        OkHttpClient client = new OkHttpClient.Builder().build();

        HashMap<String, String> map = new HashMap<>();
        map.put("page", "0");
        map.put("userId", "0");
        final String s = new Gson().toJson(map);

        videoModel.getVideo(s, new MyokHttpCallBack() {
            @Override
            public void onError(String message) {
                Toast.makeText(VideoActivity.this, "请求失败" + message, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onOk(String json, int Type) {
                final List<VideoEntity> list = new Gson().fromJson(json, new TypeToken<ArrayList<VideoEntity>>() {
                }.getType());
                datas.addAll(list);
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        myAdapter.notifyDataSetChanged();
                    }
                });
            }
        });
    }

    private void initViews() {
        gvShow = (GridView) findViewById(R.id.gv_show);
        myAdapter = new MyAdapter(datas, this);
        gvShow.setAdapter(myAdapter);
        videoModel = new VideoModelImpl();
        gvShow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(VideoActivity.this, PlayActivity.class);
                intent.putExtra("Url", datas.get(position).getVedioUrl());
                startActivity(intent);
            }
        });
    }
}

最后播放及下载的Activity

public class PlayActivity extends AppCompatActivity {
    private VideoView vv;
    private Button butDown;
    private String Url;
    private int index = 0;
    private ProgressBar pb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_play);
        requestPermissions(new String[]{
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
        }, 101);

        initDatas();
        initViews();
    }

    private void initDatas() {
        Url = getIntent().getStringExtra("Url");
    }

    private void initViews() {

        vv = (VideoView) findViewById(R.id.vv);
        butDown = (Button) findViewById(R.id.but_down);
        pb = (ProgressBar) findViewById(R.id.pb);


        vv.setVideoPath(Url);
        vv.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                vv.start();
            }
        });

        butDown.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getMp4();
            }
        });


    }

    private void getMp4() {
        MyokHttpUtils utils = MyokHttpUtils.getInstance();
        utils.doDownload(Url, "/sdcard/Download/video" + (index++) + ".mp4", new MyokHttpFileCallBack() {
            @Override
            public void onError(String message) {
                Toast.makeText(PlayActivity.this, "" + message, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onOk(String json) {
                Toast.makeText(PlayActivity.this, "" + json, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPrograss(int prograss) {
                pb.setProgress(prograss);
            }
        });
    }
}

要开心加油

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的封装 OkHttp工具类: ```java import okhttp3.*; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.Map; @Component public class OkHttpUtils { private OkHttpClient client = new OkHttpClient(); /** * 发送 GET 请求 * * @param url 请求 URL * @return 响应结果 * @throws IOException IO 异常 */ public String get(String url) throws IOException { Request request = new Request.Builder() .url(url) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } /** * 发送 POST 请求 * * @param url 请求 URL * @param params 请求参数 * @return 响应结果 * @throws IOException IO 异常 */ public String post(String url, Map<String, String> params) throws IOException { FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> entry : params.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } RequestBody requestBody = builder.build(); Request request = new Request.Builder() .url(url) .post(requestBody) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } } ``` 使用时,只需要在 Spring Boot 应用中注入该工具类即可: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.util.HashMap; import java.util.Map; @RestController public class TestController { @Autowired private OkHttpUtils okHttpUtils; @GetMapping("/test") public String test() throws IOException { String url = "http://example.com"; String result = okHttpUtils.get(url); return result; } @GetMapping("/testParam") public String testParam() throws IOException { String url = "http://example.com"; Map<String, String> params = new HashMap<>(); params.put("param1", "value1"); params.put("param2", "value2"); String result = okHttpUtils.post(url, params); return result; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值