【问题标题】:How to handle retrofit socket timeout for uploading files in android kotlin?如何处理在 android kotlin 中上传文件的改造套接字超时?
【发布时间】:2020-09-05 20:32:25
【问题描述】:
 var client = OkHttpClient()
            val builder = OkHttpClient.Builder()
            val gson = GsonBuilder()
                .setLenient()
                .create()

                builder.addInterceptor(AddCookiesInterceptor(mcontext))
                builder.addInterceptor(ReceivedCookiesInterceptor(mcontext))
                builder.callTimeout(100,TimeUnit.SECONDS)

            client = builder.build()
            retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
 //                   .addConverterFactory(ScalarsConverterFactory.create())
                .build()

这是我的改造客户服务构建器。对于带有 json 响应回调的普通 api 函数,它可以正常工作。大文件上传需要修改吗?

在当前情况下,上传 20 mb 数据,在慢速网络连接中需要更多时间,这会返回套接字超时异常。

作为多部分正文上传

 var fileBody : ProgressRequestBody? = null
   fileBody = ProgressRequestBody(file,"*/*",this@CaseFileUploadFragment)
        var fileToUpload: MultipartBody.Part = 
   MultipartBody.Part.createFormData("image",file.name, fileBody)
        var filename : RequestBody = 
    RequestBody.create(MediaType.parse("text/plain"),file.getName())

下面是用到的函数

 @Multipart
    @POST("{urlMpString}")
    fun uploadFile(
        @Path ("urlMpString") urlEndString : String, @Part file: MultipartBody.Part, @Part("file") requestBody: RequestBody,
        @Part("apiInfo") `object1`: JsonObject,  @Part("parameters") `object2`: JsonObject
    ): Call<JsonObject>

对于小型数据文件一切正常。 任何建议和帮助将不胜感激。 谢谢

【问题讨论】:

  • 也许您的服务器需要较大的超时时间,请检查 Web 服务并查看那里的超时时间,并检查连接是否持续打开。我只使用了大约 50 MB 的小文件,而且效果很好
  • @RahulChandrabhan 你能帮忙吗? stackoverflow.com/questions/62783444/…

标签: android kotlin file-upload retrofit2 multipartform-data


【解决方案1】:

试试下面的okHttpClient代码

OkHttpClient okHttpClient = new OkHttpClient.Builder()  
    .connectTimeout(5, TimeUnit.MINUTES)
    .readTimeout(30, TimeUnit.SECONDS)
    .writeTimeout(15, TimeUnit.SECONDS)
    .build();

【讨论】:

    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多