2017-01-04 4 views
0

Ich befolgte die Anweisungen auf der Seite Retrofit, um ein Bild herunterzuladen, jedoch ohne den @Streaming-Tag wäre der inputstream.read (Puffer) sofort gleich -1 und rendert die Datei leer. (Das Bild ist recht klein, nur ein paar hundert kb) Selbst wenn ich die @Streaming-Tag verwenden, würde die App abstürzt halten, wenn ich die Input verwenden aufgrund IllegalBilder mit Retrofit herunterladen leere Datei zurückgeben

Ich versuchte Httpconnection und ich konnte das Bild einfach herunterladen fein. Aber ich möchte wirklich, um es mit Retrofit funktioniert diese

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; 

} 
+1

Warum verwenden Sie Retrofit für Bilder? Retrofit ist eine gute Wahl für Ruhepi-Kunden, aber für Bilder gleiten oder Picasso wäre besser. –

+0

Verwenden Sie Picasso anstelle von Retrofit – raj

+0

Ich benutze Glide für mein Projekt. Ich möchte aber auch das Bild im internen Speicher speichern (Um es mit Glide oder Picasso zu machen, muss ich die Cache-Datei nach dem Laden speichern). Außerdem möchte ich herausfinden, warum dieser Code nicht funktioniert. Ich weiß nicht, wo ich falsch lag –

Antwort

2

Versuchen,

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

auch die Abhängigkeit hinzuzufügen;

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