Android 带有改进的2块流式服务器

Android 带有改进的2块流式服务器,android,retrofit2,chunked,Android,Retrofit2,Chunked,我应该从返回json(传输编码:chunked)的服务器流式传输端点 我有以下代码,但我无法读取响应。我尝试了responseBody.streamBytes()并将输入流转换成字符串,但在主线程中无法实现。我怎样才能读懂回复 @Streaming @GET("stream/status") Observable<ResponseBody> streamStatus(); Observable<ResponseBody> observable = ApiClientHe

我应该从返回json(传输编码:chunked)的服务器流式传输端点

我有以下代码,但我无法读取响应。我尝试了responseBody.streamBytes()并将输入流转换成字符串,但在主线程中无法实现。我怎样才能读懂回复

@Streaming
@GET("stream/status")
Observable<ResponseBody> streamStatus();

Observable<ResponseBody> observable = ApiClientHelper.getClient().streamStatus();
    observable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<ResponseBody>() {
                @Override
                public void onSubscribe(Disposable d) {
                }

                @Override
                public void onNext(final ResponseBody responseBody) {
                   //DON'T KNOW HOW TO READ DATA
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onComplete() {
                }
            });
@流媒体
@获取(“流/状态”)
可观察状态();
Observable-Observable=ApiClientHelper.getClient().streamStatus();
可观察
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@凌驾
认购的公共无效(一次性d){
}
@凌驾
public void onNext(最终响应主体响应主体){
//不知道如何读取数据
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
未完成的公共空间(){
}
});
编辑:

使用CURL的服务器响应:

*正在尝试192.168.1.3。。。
*TCP_节点集
*连接到192.168.1.3(192.168.1.3)端口80(#0)
>GET/stream/meter HTTP/1.1
>主机:192.168.1.3
>用户代理:curl/7.54.0
>接受:*/*
>Cookie:sessionId=BF253346190E1C72B532B9D6EC6A405
> 
添加
@Streaming
注释会导致改型不会将整个文件移动到内存中,而是立即传递传入的字节。这使您能够处理可能大于总可用内存的数据流。但是,如果您尝试在主线程上执行此操作,您将得到一个
android.os.NetworkOnMainThreadException
,这就是我假设您得到的。所以问题在于
.observeOn(AndroidSchedulers.mainThread)

编辑: 公平的警告。我没有运行这个

    observable
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .subscribe(new Observer<ResponseBody>() {
                @Override
                public void onSubscribe(Disposable disposable) {

                }

                @Override
                public void onNext(ResponseBody responseBody) {
                    InputStream inputStream = responseBody.byteStream();
                    BufferedReader br = null;
                    StringBuilder sb = new StringBuilder();

                    String line;
                    try {

                        br = new BufferedReader(new InputStreamReader(inputStream));
                        while (br.ready()) {
                            line = br.readLine();
                            sb.append(line);
                        }

                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        if (br != null) {
                            try {
                                br.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }

                    Log.d("streamed string", sb.toString()); // replace log with whatever you want to do with it.
                }

                @Override
                public void onError(Throwable throwable) {

                }

                @Override
                public void onComplete() {

                }
            });
可观察
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.订阅(新观察员){
@凌驾
订阅时的公共作废(一次性){
}
@凌驾
public void onNext(ResponseBody ResponseBody){
InputStream InputStream=responseBody.ByTestStream();
BufferedReader br=null;
StringBuilder sb=新的StringBuilder();
弦线;
试一试{
br=新的BufferedReader(新的InputStreamReader(inputStream));
while(br.ready()){
line=br.readLine();
某人附加(行);
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
如果(br!=null){
试一试{
br.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
Log.d(“流字符串”,sb.toString());//用您想用它做的任何事情替换日志。
}
@凌驾
公共作废登记员(可丢弃){
}
@凌驾
未完成的公共空间(){
}
});

这只是猜测,我不是http方面的专家,但我认为Retrfoit本身并不是http客户端。因此,作为您的响应,您可能已经获得了整个下载对象,而不是单个块。块的处理可能会发生在OkHTTP的某个级别。不明白。请查看我的代码,我只有onNext方法中的responsebody。当我尝试调试它时,它会出现:StringBuilder sb=new StringBuilder();当我不调试它,只需单击Run,它就不会记录日志anything@Yamila但是没有任何错误吗?你下载的内容有多大?在
StringBuilder sb=new StringBuilder()行没有任何可能出错的地方。也许它仍在加载并停留在while循环中?在循环中添加日志语句。是!它一直在循环中。我使用curl编辑我的问题和服务器响应。它每5秒返回一个响应。我改变了while循环中的条件,它现在应该可以工作了。