Android OKHttp3 学习摘记

来源:互联网 发布:数据库系统概论 答案 编辑:程序博客网 时间:2024/06/10 08:24

Android网络编程(六)OkHttp3用法全解析 http://blog.csdn.net/itachi85/article/details/51190687  (推荐)

OkHttp3的基本用法 http://www.jianshu.com/p/1873287eed87  (有扩展)

封装推荐使用 OkHttpFinal https://github.com/pengjianbo/OkHttpFinal  (基于OKHttp3)


Android Studio 配置gradle:

  compile 'com.squareup.okhttp3:okhttp:3.2.0'

  compile 'com.squareup.okio:okio:1.7.0'


基本的类和方法:

OkHttpClient,OkHttpClient.Builder,Call,Callback

Request,Request.Builder,RequestBody,FormBody,FormBody.Builder

Call mcall= mOkHttpClient.newCall(request);

call.execute() 同步

call.enqueue(new Callbak{...}) 异步  //回调函数在非UI线程中执行,故不能直接操作UI

call.cancel() 取消

RequestBuilder.tag(tag)来分配一个标签

OkHttpClient.cancel(tag)来取消所有带有这个tag的call


GET请求

private void getAsynHttp() {        mOkHttpClient=new OkHttpClient();        Request.Builder requestBuilder = new Request.Builder().url("http://www.baidu.com");        //可以省略,默认是GET请求        requestBuilder.method("GET",null);        Request request = requestBuilder.build();        Call mcall= mOkHttpClient.newCall(request);        mcall.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                if (null != response.cacheResponse()) {                    String str = response.cacheResponse().toString();                    Log.i("wangshu", "cache---" + str);                } else {                    response.body().string();                    String str = response.networkResponse().toString();                    Log.i("wangshu", "network---" + str);                }                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        Toast.makeText(getApplicationContext(), "请求成功", Toast.LENGTH_SHORT).show();                    }                });            }        });    }

POST请求

private void postAsynHttp() {        mOkHttpClient=new OkHttpClient();        RequestBody formBody = new FormBody.Builder()                .add("size", "10")                .build();        Request request = new Request.Builder()                .url("http://api.1-blog.com/biz/bizserver/article/list.do")                .post(formBody)                .build();        Call call = mOkHttpClient.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 str = response.body().string();                Log.i("wangshu", str);                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        Toast.makeText(getApplicationContext(), "请求成功", Toast.LENGTH_SHORT).show();                    }                });            }        });    }

异步上传文件

public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8"); private void postAsynFile() {        mOkHttpClient=new OkHttpClient();        File file = new File("/sdcard/wangshu.txt");        Request request = new Request.Builder()                .url("https://api.github.com/markdown/raw")                .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))                .build();            mOkHttpClient.newCall(request).enqueue(new Callback() {                @Override                public void onFailure(Call call, IOException e) {                }                @Override                public void onResponse(Call call, Response response) throws IOException {                    Log.i("wangshu",response.body().string());                }            });        }

异步下载文件

private void downAsynFile() {        mOkHttpClient = new OkHttpClient();        String url = "http://img.my.csdn.net/uploads/201603/26/1458988468_5804.jpg";        Request request = new Request.Builder().url(url).build();        mOkHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) {                InputStream inputStream = response.body().byteStream();                FileOutputStream fileOutputStream = null;                try {                    fileOutputStream = new FileOutputStream(new File("/sdcard/wangshu.jpg"));                    byte[] buffer = new byte[2048];                    int len = 0;                    while ((len = inputStream.read(buffer)) != -1) {                        fileOutputStream.write(buffer, 0, len);                    }                    fileOutputStream.flush();                } catch (IOException e) {                    Log.i("wangshu", "IOException");                    e.printStackTrace();               }               Log.d("wangshu", "文件下载成功");           }       });   }

异步上传Multipart文件

private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");private void sendMultipart(){    mOkHttpClient = new OkHttpClient();    RequestBody requestBody = new MultipartBody.Builder()            .setType(MultipartBody.FORM)            .addFormDataPart("title", "wangshu")            .addFormDataPart("image", "wangshu.jpg",                    RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/wangshu.jpg")))            .build();    Request request = new Request.Builder()            .header("Authorization", "Client-ID " + "...")            .url("https://api.imgur.com/3/image")            .post(requestBody)            .build();   mOkHttpClient.newCall(request).enqueue(new Callback() {       @Override       public void onFailure(Call call, IOException e) {       }       @Override       public void onResponse(Call call, Response response) throws IOException {           Log.i("wangshu", response.body().string());       }   });}

设置超时时间和缓存

File sdcache = getExternalCacheDir();        int cacheSize = 10 * 1024 * 1024;        OkHttpClient.Builder builder = new OkHttpClient.Builder()                .connectTimeout(15, TimeUnit.SECONDS)                .writeTimeout(20, TimeUnit.SECONDS)                .readTimeout(20, TimeUnit.SECONDS)                .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize));        OkHttpClient mOkHttpClient=builder.build();





原创粉丝点击