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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值