開源項目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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章