2013-08-07 6 views
11

Android डेवलपर ब्लॉग HttpURLConnection अन्य उपयोग करने के लिए की तुलना में की सिफारिश है अपाचे के HttpClient (http://android-developers.blogspot.com/2011/09/androids-http-clients.html)। मैं सलाह लेता हूं और फ़ाइल अपलोड प्रगति की रिपोर्टिंग में समस्या प्राप्त करता हूं।वहाँ किसी भी तरह से HttpUrlConncetion साथ सही ढंग से प्रगति अपलोड पाने के लिए

प्रगति हड़पने के लिए मेरी कोड इस तरह है:

try { 
    out = conncetion.getOutputStream(); 
    in = new BufferedInputStream(fin); 
    byte[] buffer = new byte[MAX_BUFFER_SIZE]; 
    int r; 
    while ((r = in.read(buffer)) != -1) { 
     out.write(buffer, 0, r); 
     bytes += r; 
     if (null != mListener) { 
      long now = System.currentTimeMillis(); 
      if (now - lastTime >= mListener.getProgressInterval()) { 
       lastTime = now; 
       if (!mListener.onProgress(bytes, mSize)) { 
        break; 
       } 
      } 
     } 
    } 
    out.flush(); 
} finally { 
    closeSilently(in); 
    closeSilently(out); 
} 

इस कोड excutes जो कुछ फ़ाइल आकार के लिए बहुत तेजी से है, लेकिन फ़ाइल वास्तव में अभी भी सर्वर पर अपलोड किया गया है util मैं सर्वर से प्रतिक्रिया मिलता है। ऐसा लगता है कि HttpURLConnection आंतरिक बफर में सभी डेटा कैश करता है जब मैं out.write() पर कॉल करता हूं।

तो, मैं वास्तविक फ़ाइल अपलोड प्रगति कैसे प्राप्त कर सकता हूं? ऐसा लगता है कि httpclient ऐसा कर सकता है, लेकिन httpclient पसंद नहीं किया गया है ... कोई विचार?

+1

आपको समझदार डेवलपर्स में से एक होने के लिए अपाचे के क्लाइंट का उपयोग न करने के लिए एक शानदार अद्भुत +1 मिलता है। एंड्रॉइड में सबसे खराब नेटवर्किंग फैसले इस साइट पर अपाचे क्लाइंट के नाम पर देखे गए हैं। दूसरा, आम तौर पर प्रगति एक बड़ी फाइल अपलोड करने के लिए प्रासंगिक है। आपकी फाइल कितनी बड़ी है? यदि हां, तो आपकी फ़ाइल के लिए उपयुक्त स्थानांतरण एन्कोडिंग है? – Tom

+0

@Tom मेरे ऐप को अपलोड करने वाली फ़ाइल को 30 मीटर से बड़ा नहीं करने की आवश्यकता है, और सर्वर पक्ष अब खंडित ट्रांसफर एन्कोडिंग का समर्थन नहीं करता है ... – toki

+0

@ टोकी यह पुराना है, लेकिन यदि आप सोच रहे थे कि आपको लाइन 2 में गलत वर्तनी कनेक्शन है। – charliebeckwith

उत्तर

14

में प्रगति को खारिज मैं डेवलपर दस्तावेज़ http://developer.android.com/reference/java/net/HttpURLConnection.html

To upload data to a web server, configure the connection for output using setDoOutput(true). 
For best performance, you should call either setFixedLengthStreamingMode(int) when the body length is known in advance, or setChunkedStreamingMode(int) when it is not. Otherwise HttpURLConnection will be forced to buffer the complete request body in memory before it is transmitted, wasting (and possibly exhausting) heap and increasing latency. 

setFixedLengthStreamingMode() कॉलिंग पहले मेरी समस्या को ठीक पर स्पष्टीकरण मिल गया। लेकिन जैसा कि this post द्वारा उल्लिखित है, एंड्रॉइड में एक बग है जो HttpURLConnection सभी सामग्री कैश करता है भले ही setFixedLengthStreamingMode() को कॉल किया गया हो, जो पोस्ट-फ्रॉयओ तक तय नहीं है। इसलिए मैं प्री-जिंजरब्रेड के बजाय HttpClient का उपयोग करता हूं।

+0

यह समस्या सबसे उपयोगी बात है जिसे मैंने इस समस्या से संबंधित स्टैक ओवरव्लो पर पढ़ा है। इतने सारे लोगों ने बस बफर को लिखने का ट्रैक किया और सोचा कि उन्होंने समस्या हल की है। – Brian

+0

@toki, अब इस बग पर स्थिति क्या है? – avismara

-2

उपयोग Asynctask

publishProgress("" + (int) ((total * 100)/lenghtOfFile)); 
    //type this in the while loop before write.. 

3 में प्रगति सर्वर से अपनी फ़ाइल अपलोड करने फ़ाइल अपलोड करने और बनाने के एक Progressdialog

1)

doinbackground(){ 
    your code here.. 
} 

2 में अपने कोड चलाने) को अद्यतन) और प्रगति को अद्यतन करने पर

protected void onProgressUpdate(String... progress) { 
      Progress.setProgress(Integer.parseInt(progress[0])); 
     } 

4)

protected void onPostExecute(String file_url) { 
      dismissDialog(progress); 
+0

मुझे नहीं लगता कि ओपी को इसके लिए यूआई बनाने में समस्याएं आ रही हैं। ओपी सॉकेट पर कितनी स्ट्रीम पढ़ी गई है इसकी भरोसेमंद व्याख्या करना चाहता है। "कुल" कहां से आता है? – Tom

+0

टॉम सही है, मैं अपनी फ़ाइल अपलोड करते समय नेटवर्क ट्रांसमिशन प्रगति प्राप्त करने का एक तरीका चाहता हूं, जो कि सॉकेट परत पर सर्वर पर कितने बाइट भेजे गए हैं। – toki

संबंधित मुद्दे