2010-06-16 12 views
5

मैंने URL से जानकारी डाउनलोड करने के अन्य तरीकों का प्रयास किया है, लेकिन एक तेज़ की आवश्यकता है। मुझे 250 अलग-अलग पृष्ठों को डाउनलोड और पार्स करने की ज़रूरत है, और ऐप को हास्यास्पद रूप से धीमा नहीं दिखाना चाहिए। यह वह कोड है जिसे मैं वर्तमान में एक पृष्ठ पुनर्प्राप्त करने के लिए उपयोग कर रहा हूं, कोई अंतर्दृष्टि बहुत अच्छी होगी।क्या नेट से स्ट्रिंग में पृष्ठ डाउनलोड करने का कोई तेज़ तरीका है?

try 
{ 
    URL myURL = new URL("http://www.google.com"); 
    URLConnection ucon = myURL.openConnection(); 
    InputStream inputStream = ucon.getInputStream(); 
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); 
    ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(50); 
    int current = 0; 
    while ((current = bufferedInputStream.read()) != -1) { 
     byteArrayBuffer.append((byte) current); 
    } 
    tempString = new String(byteArrayBuffer.toByteArray()); 

} 
catch (Exception e) 
{ 
    Log.i("Error",e.toString()); 
} 
+0

250 पेज? क्या आप किसी प्रकार का डेटाबेस बना रहे हैं? –

उत्तर

2

अनुरोध उसी सर्वर पर होने पर कनेक्शन को खोलने का प्रयास करें। साथ ही, बफर में पुनर्वितरण से बचने का प्रयास करें, और एक बार में जितना संभव हो उतना पढ़ें।

 

const int APPROX_MAX_PAGE_SIZE = 300; 
try 
{ 
    URL myURL = new URL("http://www.google.com"); 
    URLConnection ucon = myURL.openConnection(); 
    ucon.setRequestHeader("Connection", "keep-alive") // (1) 
    InputStream inputStream = ucon.getInputStream(); 
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); 
    ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(APPROX_MAX_PAGE_SIZE); // (2) 
    int current = 0; 
    byte[] buf = new byte[APPROX_MAX_PAGE_SIZE]; 
    int read; 
    do { 
     read = bufferedInputStream.read(buf, 0, buf.length); // (3) 
     if(read > 0) byteArrayBuffer.append(buf, 0, read); 
    } while (read >= 0); 
    tempString = new String(byteArrayBuffer.toByteArray()); 

} 
catch (Exception e) 
{ 
    Log.i("Error",e.toString()); 
} 

 
  1. सेट रखें जिंदा हैडर
  2. आवंटित क्या "आमतौर पर पर्याप्त" बफर में पुनः आबंटन से बचने के लिए है (यकीन नहीं तो आप इस की जरूरत है J2SE पर, यह भी एक विन्यास संपत्ति है)।
  3. एक बार

अस्वीकरण में एक से अधिक बाइट पढ़ें: यह लिखा गया था "अंधा में" एक जावा के लिए उपयोग के बिना। यह हो सकता है कि setRequestHeader केवल HttpURLConnection (Cast आवश्यक) पर उपलब्ध है, या कुछ पैरामीटर गलत हैं, लेकिन कृपया ऐसा करने के लिए स्वतंत्र महसूस करें।

+0

वे सभी एक ही सर्वर के लिए हैं, कोई कोड सुझाव? – cphil5

+1

कुछ जैसे ucon.setRequestHeader ("कनेक्शन", "रख-रखाव") कनेक्शन पुन: उपयोग आंतरिक रूप से संभाला जाता है। इसके अलावा, बाइट द्वारा बाइट नहीं, भाग में बफर पढ़ने की कोशिश करें। – Krumelur

+0

उपर्युक्त कोड केवल मामूली संशोधन के साथ काम करता है, मैं पुराने दिनचर्या के खिलाफ इसे बेंच करने जा रहा हूं और आपको बताता हूं। बीटीडब्लू मैं अलग-अलग पृष्ठों को पार्स करने के लिए 250 यूआरआई प्राप्त करने के लिए 75 के बारे में एक पृष्ठ का विश्लेषण करता हूं। – cphil5

1

आप निर्मित अपाचे http घटकों का उपयोग क्यों नहीं करते?

HttpClient httpClient = new DefaultHttpClient(); 
HttpGet request = new HttpGet(uri); 
HttpResponse response = httpClient.execute(request); 

int status = response.getStatusLine().getStatusCode(); 

if (status != HttpStatus.SC_OK) { 
    ByteArrayOutputStream ostream = new ByteArrayOutputStream(); 
    response.getEntity().writeTo(ostream); 
} 
+0

आईएमएचओ, यूआरएल कनेक्शन सीधे HTTP प्रोटोकॉल के साथ इंटरफेसिंग की तुलना में अधिक उच्च स्तर है। – Krumelur

+0

HttpClient.execute (अनुरोध) पर यह त्रुटियां; "एचटीपी क्लाइंट" – cphil5

+0

प्रकार से गैर-स्थैतिक विधि निष्पादन (HttpUriRequest) के लिए स्थिर संदर्भ नहीं बना सकता है org.apache.http.client.HttpClient में निष्पादन विधि स्थिर नहीं है। मैंने एचटीपी क्लाइंट के निर्माण को शामिल करने के लिए ऊपर दिए गए उदाहरण को अपडेट किया। – Schildmeijer

0

एक जमा HTTPClient का प्रयोग करें और एक ही बार में 2 या 3 अनुरोध करने के लिए प्रयास करें। और आवंटन और जीसी स्टालों से बचने के लिए मेमोरी पूल बनाने का प्रयास करें।

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

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