Android问题汇总(遥远的回忆过去)

Android-RxJava2.x+Glide图片下载案例

2019-08-25  本文已影响5人  MonkeyLei

直接上代码:

RxLoadGlidePic.java

import android.content.Context;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.Target;

import java.io.File;

import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;

/**
 * Created by hl on 2018/3/16.
 */

/**
 * Rxjava版本+Glide下载图片服务(后面改造为Presenter结构)
 */
public class RxLoadGlidePic {
    private Context context;

    public RxLoadGlidePic(Context _context) {
        this.context = _context;
    }

    /**
     * 执行请求方法
     */
    public void execute(Class _dataModelclass, String imgUrl, String srcId, final int count) {
        Observable.create(new ObservableOnSubscribe<File>() {
            @Override
            public void subscribe(ObservableEmitter<File> emitter) throws Exception {
                emitter.onNext(Glide
                        .with(context)
                        .downloadOnly()
                        .load(imgUrl)
                        .submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                        .get());
            }
        }).subscribeOn(Schedulers.io()) // 上游是io池子线程
                .observeOn(Schedulers.io()) // 处理也是子线程
                .map(new Function<File, String>() {
                    @Override
                    public String apply(File file) throws Exception {
                        if (null == file) {
                            return null;
                        }
                        /**
                         * 重新拼接图片名称,因为glide加密了文件名,然后拷贝一份文件即可!
                         */
                        String flexStr = "jpg";
                        if (imgUrl.contains("png") || imgUrl.contains("PNG")) {
                            flexStr = "png";
                        }
                        if (imgUrl.contains("jpeg") || imgUrl.contains("JPEG")) {
                            flexStr = "jpeg";
                        }
                        if (imgUrl.contains("gif") || imgUrl.contains("GIF")) {
                            flexStr = "gif";
                        }
                        if (imgUrl.contains("webp") || imgUrl.contains("WEBP")) {
                            flexStr = "webp";
                        }
                        String pngName = file.getAbsolutePath().
                                substring(0, file.getAbsolutePath().lastIndexOf(".") + 1) +
                                flexStr;
                        ///< 拷贝一个文件
                        //                        if (FileHelperUtil.copyFileIfNotExsit(file.getAbsolutePath(), pngName)) {
                        //                            return pngName;
                        //                        }
                        return null;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread()) // 结果切到UI线程
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(String src) {
                        // 加载成功了,获取下载的本地图片路径src
                    }

                    @Override
                    public void onError(Throwable e) {
                        // "加载图片失败!"
                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

其中这个地方自己搞个工具类拷贝下就行: 如果图片本身不需要格式,后缀处理,能直接支持加载,也可以直接用。。

image

这样就可以了。。之前小萌新记录了一版RxJava1.x的,目前用法不一样了。。但是思路差不多...

上一篇下一篇

猜你喜欢

热点阅读