2014-04-28 6 views
34

दिखा रहा है मैं वर्तमान में एंड्रॉइड नेटवर्क संचार के लिए स्क्वायर द्वारा रेट्रोफिट का उपयोग कर रहा हूं। एक प्रगति अधिसूचना बनाने के लिए किसी कार्य के दौरान अपनी प्रगति प्राप्त करने का कोई तरीका है, जो छवि अपलोड करते समय फेसबुक का उपयोग करता है?एंड्रॉइड रेट्रोफिट - ऑन प्रोग्रेस अपडेट प्रगति अधिसूचना

केस का उपयोग संपीड़न या स्केलिंग के बिना पूर्ण छवि गुणवत्ता की उम्मीद से एक छवि लोड करना होगा।

मैं देखता हूं कि एसिंक्टास्क के साथ यह कैसे संभव है लेकिन यह रेट्रोफिट का उपयोग करने के उद्देश्य को हरा देगा। हालांकि यह वह मार्ग हो सकता है जो मुझे लेना होगा।

+0

आप कर सकते हैं उपयोग के मामले पर विस्तृत? सबसे सरल रेट्रोफिट अनुरोध इतने कम हैं कि प्रगति संकेतकों की आवश्यकता नहीं है, लेकिन मुझे लगता है कि आप एक तस्वीर की तरह फ़ाइल अपलोड करने के लिए PUT या POST का उपयोग कर रहे हैं? – Hober

+0

सटीक रूप से @ हॉबर्ट, क्या आप एक तस्वीर अपलोड करने के लिए रेट्रोफिट का उपयोग न करने की सिफारिश करेंगे? और यदि हां, तो क्या आपके पास कोई सिफारिश है? –

+0

मैंने इसे थोड़ी देर पहले कार्यान्वित किया लेकिन समाधान नहीं मिला, इसलिए मैंने इसके बजाय एक अनिश्चित प्रगति पट्टी बनाई। – NujnaH

उत्तर

67

यह उत्तर रेट्रोफिट 1 के लिए है। समाधान के लिए रेट्रोफिट 2 see this answer के साथ संगत समाधान के लिए।


मुझे एक ही समस्या थी और अंततः इसे करने में कामयाब रहा। मैं स्प्रिंग लिब का उपयोग कर रहा था और जो मैंने नीचे दिखाया है वह स्प्रिंग के लिए काम करता है लेकिन असंगत था क्योंकि मैंने इनपुटस्ट्रीम के लिए इसका इस्तेमाल करने में गलती की थी। मैंने रीट्रोफिट का उपयोग करने के लिए अपने सभी एपीआई को स्थानांतरित कर दिया और अपलोड सूची में आखिरी वाला था, मैं आउटपुटस्ट्रीम को पढ़ने वाले बाइट्स पर अपडेट करने के लिए टाइपेडफाइल लिखने के लिए ओवरराइड करता हूं। शायद यह सुधार किया जा सकता है लेकिन जैसा कि मैंने कहा था कि जब मैं वसंत का उपयोग कर रहा था तो मैंने इसे बनाया ताकि मैंने इसका पुन: उपयोग किया। यह अपलोड करने के लिए कोड है और यह मेरे ऐप पर मेरे लिए काम कर रहा है, अगर आप फीडबैक डाउनलोड करना चाहते हैं तो आप @Streaming का उपयोग कर सकते हैं और इनपुटस्ट्रीम पढ़ सकते हैं।

ProgressListener

public interface ProgressListener { 
void transferred(long num); 
} 

CountingTypedFile

public class CountingTypedFile extends TypedFile { 

private static final int BUFFER_SIZE = 4096; 

private final ProgressListener listener; 

public CountingTypedFile(String mimeType, File file, ProgressListener listener) { 
    super(mimeType, file); 
    this.listener = listener; 
} 

@Override public void writeTo(OutputStream out) throws IOException { 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    FileInputStream in = new FileInputStream(super.file()); 
    long total = 0; 
    try { 
     int read; 
     while ((read = in.read(buffer)) != -1) { 
      total += read; 
      this.listener.transferred(total); 
      out.write(buffer, 0, read); 
     } 
    } finally { 
     in.close(); 
    } 
} 
} 

MyApiService

public interface MyApiService { 
@Multipart 
@POST("/files") 
ApiResult uploadFile(@Part("file") TypedFile resource, @Query("path") String path); 
} 

SendFileTask

private class SendFileTask extends AsyncTask<String, Integer, ApiResult> { 
    private ProgressListener listener; 
    private String filePath; 
    private FileType fileType; 

    public SendFileTask(String filePath, FileType fileType) { 
     this.filePath = filePath; 
     this.fileType = fileType; 
    } 

    @Override 
    protected ApiResult doInBackground(String... params) { 
     File file = new File(filePath); 
     totalSize = file.length(); 
     Logger.d("Upload FileSize[%d]", totalSize); 
     listener = new ProgressListener() { 
      @Override 
      public void transferred(long num) { 
       publishProgress((int) ((num/(float) totalSize) * 100)); 
      } 
     }; 
     String _fileType = FileType.VIDEO.equals(fileType) ? "video/mp4" : (FileType.IMAGE.equals(fileType) ? "image/jpeg" : "*/*"); 
     return MyRestAdapter.getService().uploadFile(new CountingTypedFile(_fileType, file, listener), "/Mobile Uploads"); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     Logger.d(String.format("progress[%d]", values[0])); 
     //do something with values[0], its the percentage so you can easily do 
     //progressBar.setProgress(values[0]); 
    } 
} 

CountingTypedFile सिर्फ TypedFile की एक प्रति लेकिन ProgressListener भी शामिल है।

+1

आखिरकार .. लंबी खोज के बाद .. जय हो गया ढेर ओवरफ्लो !!! – faruk

+0

यह पहले से ही उत्तर @ SiamakSiaSoft में जुड़ा हुआ है –

0

आप एक ProgressDialog, अधिसूचना पर यह दिखाने के लिए अधिकतम मूल्य प्राप्त करना चाहते हैं, आदि

ProgressListener

public interface ProgressListener { 
    void transferred(long num, long max); 
} 

CountingTypedFile

public class CountingTypedFile extends TypedFile { 

    private static final int BUFFER_SIZE = 4096; 

    private final ProgressListener listener; 

    public CountingTypedFile(String mimeType, File file, ProgressListener listener) { 
     super(mimeType, file); 
     this.listener = listener; 
    } 

    @Override 
    public void writeTo(OutputStream out) throws IOException { 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     FileInputStream in = new FileInputStream(super.file()); 
     long total = 0; 
     try { 
      int read; 
      while ((read = in.read(buffer)) != -1) { 
       total += read; 
       this.listener.transferred(total, super.file().length()); 
       out.write(buffer, 0, read); 
      } 
     } finally { 
      in.close(); 
     } 
    } 
} 
संबंधित मुद्दे