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