使用到的技术:
rxjava:可以用新开线程代替即可。我的主要目的是方便切换线程
glide:图片下载
使用场景:我的表情包是从接口获取的,但是在发送大表情的时候,融云需要接口参数中必须提供本地文件的Uri,因此需要将该图的缓存路径找出来,并转为Uri。
注意事项:
Flowable的.subscribeOn(Schedulers.newThread())和observeOn(AndroidSchedulers.mainThread())方法,observeOn观察者是在主线程,请求网络下载是在子线程。
Disposable disposable = Flowable.create(new FlowableOnSubscribe<File>() {
@Override
public void subscribe(FlowableEmitter<File> emitter) throws Exception {
try {
FutureTarget<File> target = Glide.with(context.getApplicationContext())
.downloadOnly()
.load(emoji.getUrl())
.submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
File imageFile = target.get();
emitter.onNext(imageFile);
} catch (ExecutionException e) {
e.printStackTrace();
emitter.onComplete();
} catch (InterruptedException e) {
e.printStackTrace();
emitter.onComplete();
}
}
}, BackpressureStrategy.BUFFER)
.subscribeOn(Schedulers.newThread())//指定在子线程中执行下载/取缓存图片路径
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<File>() {
@Override
public void accept(File file) throws Exception {
Uri remoteUri = Uri.parse(emoji.getUrl());
Uri localUri = Uri.fromFile(file);
ImageMessage imageMessage = ImageMessage.obtain(remoteUri, localUri);
RongIMClient.getInstance().sendImageMessage(Conversation.ConversationType.PRIVATE, String.valueOf(mTargetUser.getUserId()),
imageMessage, "", "", new RongIMClient.SendImageMessageCallback() {
@Override
public void onAttached(Message message) {
}
@Override
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
}
@Override
public void onSuccess(Message message) {
Log.i(TAG, "发送成功,图片为:remoteUri=" + remoteUri + ";\nlocalUri="+localUri);
}
@Override
public void onProgress(Message message, int i) {
}
});
}
});
网友评论