如何在后台线程中顺序执行函数?

wf82jlnq  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(305)

我正在制作一个android聊天应用程序,它具有从应用程序中选择和发送多个图像的功能。我使用rxjava在后台线程中运行send函数。
我从画廊里取了多张照片放进去 for 循环一个接一个,如下面的代码所示。我面临的问题是图像的顺序没有得到保存。
这是我用来发送多个图像的代码。

public void onMessageSent(String messageText, ArrayList<Attachment> attachments) {
        if (!ObjectUtils.isEmpty(attachments)) {
            Stream.of(attachments)
                    .forEach(attachment -> chatInteractor.sendAttachment(mConversationId, attachment, messageParticipants, quoteMessageId)
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(MapUtils::dummyfunction, errorHandler::logErrorViaInstance));

        }
    }
``` `messageText` 包含必须与图像一起发送的消息,即arraylist `attatchments` 包含所有图像及其数据和 `chatInteractor.sendAttachment` 是一个 `public` 具有返回类型的函数 `Maybe<Message>` .
图像的顺序保持在 `attatchments` . 但是当所有图像都在后台线程中发送时 `Schedulers.io()` ,有些图像发送得早一些,有些发送得晚一些。
如何维持秩序?我应该做哪些代码更改?
我试着换衣服 `subscribeOn` 至 `Schedulers.single()` 以及 `Schedulers.trampoline()` ,但他们都没帮上忙。
mznpcxlj

mznpcxlj1#

直接使用rxjava进行一系列上传:

Observable.fromIterable(attachments)
.concatMapMaybe(attachment -> 
     chatInteractor.sendAttachment(
         mConversationId, attachment, messageParticipants, quoteMessageId
     )
     .subscribeOn(Schedulers.io())
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(MapUtils::dummyfunction, errorHandler::logErrorViaInstance);

相关问题