开源项目Meizhi学习笔记--保存图片到本地

来源:互联网 发布:eagle软件 编辑:程序博客网 时间:2024/05/18 18:02
public class RxMeizhi {    public static Observable<Uri> saveImageAndGetPathObservable(Context context, String url, String title) {        //使用RxJava,因为后面涉及请求网络和耗时操作        return Observable.create(new Observable.OnSubscribe<Bitmap>() {//发出Bitmap            @Override public void call(Subscriber<? super Bitmap> subscriber) {                Bitmap bitmap = null;                try {                    //通过Picasso把图片保存下来                    bitmap = Picasso.with(context).load(url).get();                } catch (IOException e) {                    //如果出错,把错误抛出给订阅者                    subscriber.onError(e);                }                if (bitmap == null) {                    subscriber.onError(new Exception("无法下载到图片"));                }                //发出bitmap                subscriber.onNext(bitmap);                //发出完成                subscriber.onCompleted();            }            //进行转换,将Bitmap转为Uri        }).flatMap(new Func1<Bitmap, Observable<? extends Uri>>() {            @Override            public Observable<? extends Uri> call(Bitmap bitmap) {                File appDir = new File(Environment.getExternalStorageDirectory(), "Meizhi");                if (!appDir.exists()) {                    appDir.mkdir();                }                String fileName = title.replace('/', '-') + ".jpg";                File file = new File(appDir, fileName);                try {                    FileOutputStream outputStream = new FileOutputStream(file);                    assert bitmap != null;                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);                    outputStream.flush();                    outputStream.close();                } catch (IOException e) {                    e.printStackTrace();                }                Uri uri = Uri.fromFile(file);                // 通知图库更新                Intent scannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);                context.sendBroadcast(scannerIntent);                return Observable.just(uri);            }            //上面的操作将在io线程进行        }).subscribeOn(Schedulers.io());    }}
  private void saveImageToGallery() {        // @formatter:off        Subscription s = RxMeizhi.saveImageAndGetPathObservable(this, mImageUrl, mImageTitle)            .observeOn(AndroidSchedulers.mainThread())//切换线程,之后的操作将在主线程            .subscribe(new Action1<Uri>() {                @Override                public void call(Uri uri) {                    File appDir = new File(Environment.getExternalStorageDirectory(), "Meizhi");                    String msg = String.format(PictureActivity.this.getString(R.string.picture_has_save_to),                            appDir.getAbsolutePath());                    Toasts.showShort(msg);                }            }, new Action1<Throwable>() {                @Override                public void call(Throwable error) {                    Toasts.showLong(error.getMessage() + "\n再试试...");                }            });        // @formatter:on        //用于取消请求        addSubscription(s);    }
0 0
原创粉丝点击