2012-05-03 8 views
6

मेरे पास एक यूआरएल है, जब मैं ब्राउज़र में प्रवेश करता हूं, तो छवि पूरी तरह से खुलती है। लेकिन जब मैं निम्नलिखित कोड की कोशिश, मैं -1 के रूप में getContentLength() मिलती है:URLConnection.getContentLength() रिटर्न -1

URL url = new URL(imageUrl); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

// determine the image size and allocate a buffer 
int fileSize = connection.getContentLength(); 

कृपया मुझे मार्गदर्शन क्या इस के पीछे कारण हो सकता है?

+3

आपके पास हमेशा एक सामग्री लम्बाई नहीं होगी, उदाहरण के लिए स्ट्रीमिंग सेवा के मामले में; भी, सर्वर इसे भेज नहीं सकता है। आप उपस्थित होने वाली सामग्री की लंबाई पर निर्भर नहीं हो सकते हैं। – dmon

+0

@ डॉन मुझे उस डेटा (छवि) के बाइट [] की आवश्यकता है। अगर मेरे पास आकार नहीं है, तो कृपया मुझे मार्गदर्शन करें कि मैं उसमें बाइट [] कैसे प्राप्त कर सकता हूं? – Khawar

+2

यह एक बुरा विचार है। एंड्रॉइड में मेमोरी काफी बाधित है, और आपको विशाल बाइट एरे आवंटित नहीं करना चाहिए। इसके बजाए, आपको डिस्क पर प्रतिक्रिया स्ट्रीम करना चाहिए और वहां से छवि को पढ़ना चाहिए (और आवश्यकतानुसार आकार बदलना)। – dmon

उत्तर

8

यदि सर्वर Chunked Transfer Encoding का उपयोग कर प्रतिक्रिया भेज रहा है, तो आप आकार की पूर्व-गणना करने में सक्षम नहीं होंगे। प्रतिक्रिया स्ट्रीम की जाती है, और स्ट्रीम को पूरा होने तक आपको छवि को स्टोर करने के लिए बस एक बफर आवंटित करना होगा। ध्यान दें कि आपको केवल यह करना चाहिए यदि आप गारंटी दे सकते हैं कि छवि स्मृति में फिट होने के लिए पर्याप्त छोटा है। फ्लैश स्टोरेज के जवाब को स्ट्रीम करना एक बहुत ही उचित विकल्प है यदि छवि बड़ी हो सकती है।

में स्मृति समाधान:

private static final int READ_SIZE = 16384; 

byte[] imageBuf; 
if (-1 == contentLength) { 
    byte[] buf = new byte[READ_SIZE]; 
    int bufferLeft = buf.length; 
    int offset = 0; 
    int result = 0; 
    outer: do { 
     while (bufferLeft > 0) { 
      result = is.read(buf, offset, bufferLeft); 
      if (result < 0) { 
       // we're done 
       break outer; 
      } 
      offset += result; 
      bufferLeft -= result; 
     } 
     // resize 
     bufferLeft = READ_SIZE; 
     int newSize = buf.length + READ_SIZE; 
     byte[] newBuf = new byte[newSize]; 
     System.arraycopy(buf, 0, newBuf, 0, buf.length); 
     buf = newBuf; 
    } while (true); 
    imageBuf = new byte[offset]; 
    System.arraycopy(buf, 0, imageBuf, 0, offset); 
} else { // download using the simple method 

सिद्धांत रूप में, अगर HTTP क्लाइंट HTTP 1.0 के रूप में प्रस्तुत है, सबसे अधिक सर्वर वापस गैर स्ट्रीमिंग मोड में स्विच होगा, लेकिन मैं नहीं मानता कि यह एक संभावना है URL कनेक्शन के लिए।

+0

आपके उत्तर के लिए धन्यवाद। लेकिन मुझे उस डेटा (छवि) के बाइट [] की आवश्यकता है। अगर मेरे पास आकार नहीं है, तो कृपया मुझे मार्गदर्शन करें कि मैं उसमें बाइट [] कैसे प्राप्त कर सकता हूं? – Khawar

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