使用RxJava2连接2个字符串列表并写入子线程中的文本文件

时间:2018-09-17 04:56:18

标签: android rx-java rx-java2

我有2个字符串列表,需要将其合并然后写入文件。 我不确定要使用哪个Rx运算符。

我能够实现合并部分,但不能确定如何进行文件操作(打开,写入和关闭)

object(app\models\Category)[83]
  private '_attributes' (yii\db\BaseActiveRecord) => 
    array (size=4)
      'id' => int 694
      'title' => string 'Запчасти Mac' (length=20)
      'parent' => int 685

请建议如何从此处继续。

请注意所有这些操作应在子线程中进行。

1 个答案:

答案 0 :(得分:0)

您正在从可迭代对象创建可观察对象,因此该可观察对象基于推送。 rxjava立即抽取值。

因此,您可以从头开始打开文件,然后使用订阅的onCompletion部分将其关闭。还有一个onSubscribe可能作为要订阅的参数,但我避免了这种情况,以避免对文件实例使用全局变量。

这是订阅的最详细定义:

public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe);

这里是一个例子。我使用的不是文件编写器,而是字符串编写器,但这没什么区别。

通过使用 Schedulers.io()在IO线程内完成处理。另外,每个步骤都会写出其线程名称。

private static Writer writer = null;

public static void main(String[] args) throws InterruptedException {

    List<String> collectionNames = Arrays.asList("test1", "test2", "test3");

    List<String> collectionRollNumbers = Arrays.asList("50", "52", "54");

    System.out.println("main thread=" + Thread.currentThread().getName());

    Observable.fromIterable(collectionNames)
            .subscribeOn(Schedulers.io())
            .zipWith(collectionRollNumbers,
                    (name, rollNumber) -> {
                        System.out.println("zip thread=" + Thread.currentThread().getName());
                        return String.format("%s,%s\n", name, rollNumber);
                    })
            .subscribe(
                    concatedString -> {
                        if (writer == null) {
                            //open "File" thread
                            System.out.println("open thread=" + Thread.currentThread().getName());
                            writer = new StringWriter();
                        }

                        //write "File" part 
                        System.out.println("subscribe item thread=" + Thread.currentThread().getName());
                        System.out.println(concatedString);
                        writer.write(concatedString);
                    },
                    error -> System.out.println(error),
                    () -> {
                        //Close "File" part 
                        System.out.println("close thread=" + Thread.currentThread().getName());
                        System.out.println("close output stream");
                        writer.close();
                    });
    Thread.sleep(2000);
    System.out.println("result= " + writer.toString());
}

运行此结果会

main thread=main
zip thread=RxCachedThreadScheduler-1
open thread=RxCachedThreadScheduler-1
subscribe item thread=RxCachedThreadScheduler-1
test1,50

zip thread=RxCachedThreadScheduler-1
subscribe item thread=RxCachedThreadScheduler-1
test2,52

zip thread=RxCachedThreadScheduler-1
subscribe item thread=RxCachedThreadScheduler-1
test3,54

close thread=RxCachedThreadScheduler-1
close output stream
result= test1,50
test2,52
test3,54