OkHttp使用(二)加载图片及下载文件


         加载图片 及 下载文件,用法基本同Get和Post方式,只是在使用返回的Response处理上不同;

         通过Get及Post方式直接获取字符数据,通过response.body().string()即获取到了服务端返回的结果;而加载图片 及 文件下载,需要通过response.body().byteStream()得到文件流(InputStream),再保存或得到图片 及  文件。

 

        使用RxJava配合加载图片的实例。

final String url = "https://img-my.csdn.net/uploads/201402/24/1393242467_3999.jpg";
rx.Observable.just(url)
        .map(new Func1() {
            @Override
            public Bitmap call(String s) {
                final okhttp3.Request request = new okhttp3.Request.Builder()
                        .url(s)
                        .build();
                try {
                    final Response response = mOkHttpClient.newCall(request).execute();
//从InputStream中得到bitmap
                    return BitmapFactory.decodeStream(response.body().byteStream());
                }
                catch (IOException e) {
                    e.printStackTrace();
                    throw new Error(e);
                }
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
            }
            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "error:" + e.toString());
            }
            @Override
            public void onNext(Bitmap bitmap) {
                mImageView.setImageBitmap(bitmap);
            }
        }) ;


        使用RxJava配合,下载文件,同加载图片基本相同,只是在处理文件流时稍有差异。

final String url = "https://img-my.csdn.net/uploads/201402/24/1393242467_3999.jpg";
final String fileDir = getDir();
File dirFile = new File(fileDir);
if(!dirFile.exists()) {
    dirFile.mkdirs();
}
rx.Observable.just(url)
        .map(new Func1() {
            @Override
            public File call(final String s) {
                final okhttp3.Request request = new okhttp3.Request.Builder()
                        .url(s)
                        .build();
                //
                InputStream is = null;
                FileOutputStream fos = null;
                byte[] buffer = new byte[1024];
                int lenght = 0;
                try {
                    final Response response = mOkHttpClient.newCall(request).execute();
                    is = response.body().byteStream();
                    File tempFile = new File(fileDir, getFileName(s));
                    fos = new FileOutputStream(tempFile);
                    //
                    while ((lenght = is.read(buffer)) > 0) {
                        fos.write(buffer, 0, lenght);
                    }
                    fos.flush();
                    //
                    return tempFile;
                } catch (IOException e) {
                    e.printStackTrace();
                    throw new Error(e);
                } finally {
                    try {
                        if (is != null) is.close();
                    } catch (IOException e) {
                    }
                    try {
                        if (fos != null) fos.close();
                    } catch (IOException e) {
                    }
                }
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
            }
            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "error:" + e.toString());
            }
            @Override
            public void onNext(File file) {
                Log.i(TAG, file == null ? "file is null" : file.getAbsolutePath());
            }
        });


你可能感兴趣的:(OkHttp,Android)