OkHtto&單例模式思路

OkHttp

什麼是OkHttp?

okhttp是一個第三方類庫,用於android中請求網絡。
這是一個開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso和LeakCanary) 。用於替代HttpUrlConnection和Apache HttpClient(android API23 裏已移除HttpClient)。

Tips

使用時需導入依賴:

implementation 'com.squareup.okhttp3:okhttp:3.12.1'

需要使用Handle來更新UI

GET請求

public void getjson(){
        //TODO 1:client對象
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.callTimeout(5, TimeUnit.SECONDS);//連接超時
        builder.readTimeout(5,TimeUnit.SECONDS);//讀取超時
        OkHttpClient client = builder.build();
        //TODO 2:request對象
        Request.Builder builder1 = new Request.Builder();
        builder1.url("http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&");//設置網址
        builder1.get();//設置請求方法
        Request request = builder1.build();
        //TODO 3:發起連接call
        Call call = client.newCall(request);
        //TODO 4:通過call得到response
        call.enqueue(new Callback() {
            //請求失敗
            @Override
            public void onFailure(Call call, IOException e) {
            }
            //請求成功
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //獲得響應體:json串
                ResponseBody body = response.body();
                //通過body直接轉成字符串
                String json = body.string();
               // Toast.makeText(MainActivity.this, ""+json, Toast.LENGTH_SHORT).show();
                Message obtain = Message.obtain();
                obtain.what=GET_JSON_OK;
                obtain.obj=json;
                handler.sendMessage(obtain);

            }
        });
    }

POST請求

 private void post() {
        OkHttpClient client = new OkHttpClient.Builder()
                .callTimeout(5, TimeUnit.SECONDS)
                .readTimeout(5, TimeUnit.SECONDS)
                .build();
        //完成請求體:
        FormBody formBody = new FormBody.Builder()
                .add("phone", "13594343356")
                .add("passwd", "123654")
                .build();
        final Request request = new Request.Builder()
                .url("https://www.apiopen.top/createUser?key=00d91e8e0cca2b76f515926a36db68f5&")
                .post(formBody)//post提交必須要設置請求體
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String string = response.body().string();
                Message obtain = Message.obtain();
                obtain.what=GET_JSON_OK;
                obtain.obj=string;
                handler.sendMessage(obtain);
            }
        });
    }

下載文件

public void downLoad() {
                OkHttpClient client = new OkHttpClient.Builder().build();
                Request request = new Request.Builder()
                        .get()
                        .url("http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4 ")
                        .build();
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }
                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        long l = response.body().contentLength();//獲得返回數據的總大小
                        InputStream inputStream = response.body().byteStream();//轉換成字節流
                        FileOutputStream fileOutputStream = new FileOutputStream(new File("/sdcard/DCIM/monkey.mp4"));
                        byte[] b = new byte[1024];
                        int len = 0;
                        int count = 0;
                        while ((len = inputStream.read(b))!=-1){
                            fileOutputStream.write(b,0,len);
                            count+=len;
                            final int progress = (int)(count*100/l);
                            //handler更新UI
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    if (progress == 100){
                                        mBar.setProgress(100);
                                        Toast.makeText(MainActivity.this, "下載完成", Toast.LENGTH_SHORT).show();
                                    }
                                    else {
                                        mBar.setProgress(progress);
                                    }
                                }
                            });
                        }
                    }
                });
            }
        });

上傳文件

public void upLoad() {
                OkHttpClient client = new OkHttpClient.Builder()
                        .callTimeout(5, TimeUnit.SECONDS)
                        .readTimeout(5, TimeUnit.SECONDS)
                        .build();
                //上傳文件的請求體
                MultipartBody requestBody = new MultipartBody.Builder()
                        .setType(MultipartBody.FORM)
                        .addFormDataPart("file", "倒數.mp3",RequestBody.create(MediaType.parse("media/mp3"), new File("/sdcard/Music/G.E.M. 鄧紫棋 - 倒數.mp3")))
                        .build();
                final Request request = new Request.Builder()
                        .url("http://169.254.220.85/czp666/")
                        .post(requestBody)
                        .build();
                Call call = client.newCall(request);
                call.enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                    }
                    @Override
                    public void onResponse(Call call, Response response) throws IOException {

                    }
                });
            }
        });
    }

單例模式完成以上操作:

回調接口

public interface OkListener {
    public void yes(String msg);//成功調用的方法
    public void no(String msg);//失敗調用的方法
}

HttpUtils

//懶漢單例
public class OkhttpUtils {
    private OkHttpClient client = null;
    public static final int TIME = 60;
    public Handler handler = new Handler();
    public static OkhttpUtils okhttpUtils = null;
    //空參構造
    private  OkhttpUtils() {
        client = new OkHttpClient.Builder()
                .build();
    }
    //雙層校驗
    public static OkhttpUtils getInstance(){
        if (okhttpUtils == null){
            synchronized (Object.class){
                if (okhttpUtils == null){
                    okhttpUtils = new OkhttpUtils();
                }
            }
        }
      return okhttpUtils;
    };
    //GET
    public void doGet(String url, final OkListener okListener){
        final Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                if (okListener!=null){
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            okListener.no(message);
                        }
                    });
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String string = response.body().string();

                if (okListener!=null){
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            okListener.yes(string);
                        }
                    });
                }
            }
        });
    }
    //POST
    public void doPost(String post_url, HashMap<String,String> map, final OkListener okListener){
        FormBody.Builder builder = new FormBody.Builder();
        Set<Map.Entry<String, String>> entries = map.entrySet();//鍵直對的集合
        for (Map.Entry<String, String> entry : entries) {
            builder.add(entry.getKey(),entry.getValue());
        }
        FormBody formBody = builder.build();
        Request request = new Request.Builder()
                .post(formBody)
                .url(post_url)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                if (okListener!=null){
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            okListener.no(message);
                        }
                    });
                }
            }

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

    }
}
 //DOWNLOAD
    public void doDown(String picurl, final String title, final OkListener okListener){
        Request request = new Request.Builder()
                        .get()
                        .url(picurl)
                        .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        okListener.no(message);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                InputStream inputStream = response.body().byteStream();//轉換成字節流
                FileOutputStream fileOutputStream = new FileOutputStream(new File(title));
                byte[] b = new byte[1024];
                int len = 0;
                while ((len = inputStream.read(b))!=-1){
                    fileOutputStream.write(b,0,len);
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        okListener.yes("OK");
                    }
                });
            }
        });
    }
    //upload
    public void doUp(String picpath, final String title, final OkListener okListener){
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        builder.addFormDataPart("file",title, RequestBody.create(MediaType.parse("media/jpg"),new File(picpath)));
        MultipartBody body = builder.build();


        Request request = new Request.Builder()
                .post(body)
                .url("http://192.168.43.145/czp666/")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        okListener.no(message);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                InputStream inputStream = response.body().byteStream();//轉換成字節流
                FileOutputStream fileOutputStream = new FileOutputStream(new File(title));
                byte[] b = new byte[1024];
                int len = 0;
                while ((len = inputStream.read(b))!=-1){
                    fileOutputStream.write(b,0,len);
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        okListener.yes("OK");
                    }
                });
            }
        });
    }
}

MainActivity

MainActivity中使用HttpUtils對象點所需方法,穿所需要的參數及new一個回調接口來完成操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章