यदि सर्वर 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 कनेक्शन के लिए।
आपके पास हमेशा एक सामग्री लम्बाई नहीं होगी, उदाहरण के लिए स्ट्रीमिंग सेवा के मामले में; भी, सर्वर इसे भेज नहीं सकता है। आप उपस्थित होने वाली सामग्री की लंबाई पर निर्भर नहीं हो सकते हैं। – dmon
@ डॉन मुझे उस डेटा (छवि) के बाइट [] की आवश्यकता है। अगर मेरे पास आकार नहीं है, तो कृपया मुझे मार्गदर्शन करें कि मैं उसमें बाइट [] कैसे प्राप्त कर सकता हूं? – Khawar
यह एक बुरा विचार है। एंड्रॉइड में मेमोरी काफी बाधित है, और आपको विशाल बाइट एरे आवंटित नहीं करना चाहिए। इसके बजाए, आपको डिस्क पर प्रतिक्रिया स्ट्रीम करना चाहिए और वहां से छवि को पढ़ना चाहिए (और आवश्यकतानुसार आकार बदलना)। – dmon