java - 使用 Retrofit 下载图像返回空文件

标签 java android retrofit

我按照Retrofit页面上的说明下载图像,但是,如果没有@Streaming标记,inputstream.read(buffer)将立即等于-1,使文件呈现为空。 (图片很小,只有几百kb) 即使我使用@Streaming标签,当我使用输入流时,由于IllegalStateException,应用程序也会不断崩溃

我尝试了 HttpConnection,并且可以很好地下载图像。但是,我真的想让它与 Retrofit 一起使用

public static String downloadImage(String bearer, long pictureId,Context context){
    String path = "";
    NetworkAPI apiService = NetworkClient.getClient().create(NetworkAPI.class);
    //Call<ResponseBody> downloadCall = apiService.downloadImage(bearer,pictureId);
    Call<ResponseBody> downloadCall = apiService.downloadFileWithDynamicUrlSync("https://androidtutorialpoint.com/api/RetrofitAndroidImageResponse");

    try {
        Response<ResponseBody> response = downloadCall.execute();
        if(response.isSuccessful()) {

            Log.d(TAG, "success download" + response.body().string());

            Log.d("DownloadImage", "Reading and writing file");
            InputStream in = null;
            OutputStream out = null;

            try {
                in = response.body().byteStream();


                File file = PictureUtil.createImageFile(context);

                Uri photoURI = FileProvider.getUriForFile(context,
                        "vn.com.wk.bradleyaudit.fileprovider",
                        file);

                out = new FileOutputStream(file);


                long fileSize = response.body().contentLength();
                long downloadedSize = 0;

                Log.d("DownloadImage", "size"+fileSize);
                byte[] buffer = new byte[4096];

                while (true) {
                    int bufferLength = in.read(buffer);
                    Log.d("DownloadImage", "buffer Length"+bufferLength);

                    if (bufferLength == -1) {
                        break;
                    }
                    out.write(bufferLength);
                    out.write(buffer, 0, bufferLength);
                    downloadedSize += bufferLength;

                }

                out.flush();
                path = photoURI.toString();
                Log.d("DownloadImage", "path"+path);
            }
            catch (IOException e) {
                Log.d("DownloadImage",e.toString());
            }
            finally {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }

            }

        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    return path;

}

最佳答案

试试这个,

 Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

同时添加依赖;

compile 'com.squareup.picasso:picasso:2.5.2'

关于java - 使用 Retrofit 下载图像返回空文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41460254/

相关文章:

java - SQL "SCRIPT"命令备份h2数据库

java - 是否可以序列化/反序列化多级 json 对象?

javascript - 应用程序Phonegap内的Json!什么是路径?

android - 在 header 中发送 token (不同的 Activity )

java - 第一个动态 Web 项目

java - Android - 定时器类

android - Retrofit2:如何从响应中保存 cookie

android - 如何在 Android 10 (Q) 上直接从外部下载目录读取文件

android - 改造 - 不同的 react

java - 如何将Retrofit onResponse方法返回的Json数据发送到其他类?