如何在Android应用中更快地上传图片?

时间:2017-03-11 09:49:37

标签: android upload

我正在开发一个类似于OLX的Android应用,允许用户在图库中添加广告和课程选择图片以上传到我的服务器上。但上传大图片需要很长时间。

如何解决此问题?

我使用 Volley库上传图片。有没有更好的图书馆?

2 个答案:

答案 0 :(得分:1)

你的问题很广泛,但这里有一些想法:

  • 将图片大小调整为较小尺寸:用户可能会上传12-16万像素图像,但1920x1080通常绰绰有余,只有2百万像素,相当小。
  • 使用带有损耗压缩的其他格式: 75%质量的JPEG图片与100%几乎没有区别,而它的尺寸可能要小2到3倍。
  • 增加请求的缓冲区大小:更高的缓冲区大小会导致更少的数据包,这意味着更快的上传速度。虽然如果用户连接非常糟糕(数据包丢失很高),较小的数据包有时会更快。

前两点你会看到很高的性能提升,如果你离地理位置的服务器很远,你可能只会看到最后一点的改善。

答案 1 :(得分:0)

使用此

Retrofit retrofit = new Retrofit.Builder().client(okHttpClient).baseUrl(domain)
            .addConverterFactory(GsonConverterFactory.create()).build();
   Service service = retrofit.create(Service.class);

   RequestBody requestBody = RequestBody.create(MediaType.parse("*/*"), file);

   final MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
   final RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());

   Call<ServerResponse> upload = service.uploadFile(fileToUpload, filename);

   upload.enqueue(new Callback<ServerResponse>() {
        @Override
        public void onResponse(Call<ServerResponse> call, final Response<ServerResponse> response) {
            final ServerResponse serverResponse = response.body();
            if (serverResponse.getSuccess()) {
                //Handle Response
            }
        }

        @Override
        public void onFailure(Call<ServerResponse> call, Throwable t) {
            if(t instanceof SocketTimeoutException){
                Toast.makeText(getApplicationContext(), "Unable To Upload\nError: Socket Time out. Please try again", Toast.LENGTH_LONG).show();
            }
            t.printStackTrace();
        }
    });

服务接口

public interface Service {
@Multipart
@POST("path/upload.php")
Call<ServerResponse> uploadFile(@Part MultipartBody.Part file, @Part("file") RequestBody name);

}