【问题标题】:Retrofit onFailure throws "Unexpected end of stream" message in scrolling a endless scroll listenerRetrofit onFailure 在滚动无限滚动侦听器时抛出“Unexpected end of stream”消息
【发布时间】:2019-08-22 06:31:50
【问题描述】:

我正在使用 retrofit 2 library 的分页以无限滚动recyclerView 在我的应用程序中加载服务器数据。但不幸的是,在滚动一些页面改造onFailure 方法后,会抛出一条显示“Unexpected end of stream”的消息。此消息显示在任意页面中。有时它会在滚动 6 页后显示,有时会在滚动 12 页后显示。然后改造不会加载任何内容。

谁能给出一些可行的建议?

【问题讨论】:

  • 这实际上是在模拟器中发生的,而不是在真实设备中!可能是模拟器无法长时间保持 HTTP 连接。所以请在真机上进行测试,并确保在每个 API 接口中添加 @Headers({"Connection: close"})。

标签: java android android-recyclerview retrofit2 endlessscroll


【解决方案1】:

你可以试试

OkHttpClient client = new OkHttpClient.Builder()
    .retryOnConnectionFailure(true)
    .build();

【讨论】:

  • 这实际上并没有多大帮助
【解决方案2】:

只需将标题添加到您的请求中

@Headers({"Connection: close"})

这意味着您应该在每次请求后关闭连接。

【讨论】:

  • 您好,感谢您的回复。你能说在哪里添加这个标题吗?在界面中?
  • 哪种方法?你能提供一些虚拟代码吗?
  • 请查看以下链接,这里附上对应代码paste.ubuntu.com/p/DwfsSX8dHC
  • getposts 方法从服务器获取 json 并转换为我定义的模型对象。没有其他的。这里没有方法定义。我认为改造会通过这种方法自动进行这种转换。
  • getposts 方法没有定义。我认为这是改造的默认机制。 getposts 只是一个名称。
【解决方案3】:

我最近遇到了这个问题,以下组合帮助了我

  1. 对于 OkHttpClient,将连接失败时重试设置为 true

    OkHttpClient client = new OkHttpClient.Builder()
      .retryOnConnectionFailure(true)
      .build(); 
    
  2. 由于这是由于连接未正确关闭造成的,请在改造请求中添加 Connection 标头

    @Headers({
            "Connection: close"
    })
    @FormUrlEncoded
    @POST(Const.CHAT_LIST_API)
    Call<ResponseModel<ChatListModel>> chatList(
            @Field("user_id") int userid,
            @Field("device_type") int device_type,
            @Field("token") String token,
            @Field("language") String language,
            @Field("timezone") String timezone
    );
    

以上是调用服务的接口方法。您需要将上述标题部分添加到您的服务中

重试基本上会减少机会,实际解决方法是通过标题

【讨论】:

  • 能否请您详细说明或一些详细说明的链接?不幸的是,我不明白它,我不确定在哪里添加这段代码。很抱歉给您带来不便。
  • 你把这段代码放在你编写改造将使用的接口的地方......把它放在那里声明的方法之上......至于 okhttp 搜索如何设置自定义客户端进行改造,你'我会明白我所说的
  • 到目前为止我做到了。但是这种方法还没有解决问题..你能检查一下作为链接附加的代码吗? paste.ubuntu.com/p/hjFMxqx7VX
  • 如果这不起作用,请检查您的服务器端响应,它可能在 http 响应标头中给出了错误的内容长度,您的客户端代码似乎很好
  • 但服务器响应有时工作正常,有时会抛出“意外的流结束”。就像我在一个页面上得到这个 onFailure() 然后如果我回到上一页然后立即来到那个页面(抛出异常),那么它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多