在我的Android应用中,我需要使用Socket
来发送和接收字节数组。为方便起见,我希望使用与Observable
相关联的Socket
。
在网上看到我发现了这段代码:
import rx.lang.scala.Observable
val s = Observable.using[Char,Socket](new Socket("10.0.2.2", 9002))(
socket => Observable.from[Char](Source.fromInputStream(socket.getInputStream).toIterable),
socket => Try(socket.close))
.subscribeOn(rx.lang.scala.schedulers.IOScheduler.apply)
val a = s.subscribe(println, println)
它可以工作,但一次输出一个字符,例如当发送“hello there”字符串时,输出为:
I/System.out: h
I/System.out: e
I/System.out: l
I/System.out: l
I/System.out: o
I/System.out:
I/System.out: t
I/System.out: h
I/System.out: e
I/System.out: r
I/System.out: e
但是我希望在我的订阅中收到一个缓冲的字节数组。我怎样才能做到这一点?
答案 0 :(得分:1)
正如@SeanVieira已经说过的那样,首先必须决定如何聚合流元素和字符。如果您知道在每条消息之后将关闭流,您可以等待接收整个消息,然后在onCompleted()
上发出序列。
我认为到目前为止你实施的内容非常好,因为它取决于观察者想要处理角色的内容和方式。
然后,您可以根据需要添加流转换,例如: G。
在您已创建的Observable上使用tumblingBuffer
的解决方案可能如下所示(未经测试):
source.tumblingBuffer(source.filter(_ == '\n'))
其中缓冲来自源的任何内容,并在border-observable source.filter(...)
发出元素后发出整个缓冲区。然后,您可以使用mkString
将字符序列转换为字符串并订阅该Observable:
source.tumblingBuffer(source.filter(_ == '\n')).map(mkString(_))