9

मेरे पास एक जटिल ऐप है जो एडब्ल्यूएस पर मेरे webservice से बहुत सारी सामग्री डाउनलोड करता है। हालांकि, मैं SocketTimeoutException समय का 50% प्राप्त करता रहता हूं। मेरे शोध के आधार पर, मुझे लगता है कि वहाँ कारणों में निम्न हो सकता है:सॉकेटटाइमआउट एक्सेप्शन एंड्रॉइड

  • के लिए समय कनेक्शन समयबाह्य कम है: मैं इसे 100 सेकंड के लिए वृद्धि हुई है, लेकिन अभी भी यह त्रुटि मिलती रहती।
  • मेमोरी लीक: मैं GC चेतावनियां प्राप्त करता रहता हूं। मैंने लेख पढ़े हैं और मेरे कोड को बेहतर बनाने की कोशिश की है लेकिन यह या तो मदद नहीं करता है। मुझे यह भी जिक्र करना होगा कि मेरा ऐप 2000+ 30 केबी जेएसओएन को पृष्ठभूमि थ्रेड में एक के बाद डाउनलोड करता है। इस कुशलता से सुधार करने के सुझावों का अत्यधिक स्वागत किया जाएगा!
  • सर्वर समस्या: चूंकि अमेज़ॅन वेब सेवा अत्यधिक विश्वसनीय है, इसलिए यह अंतर्निहित समस्या नहीं हो सकती है।
  • एकाधिक थ्रेडिंग: क्या यह किसी भी तरह जिम्मेदार हो सकता है?
  • डाउनलोड करने का गलत तरीका: मुझे संदेह है कि मैं एक अक्षम तरीके से डाउनलोड कर रहा हूं। यदि मैं गलत हूं तो मुझे सही करों।

कृपया मुझे असली समस्या का पता लगाने में मदद करें। धन्यवाद !

public synchronized String getJSONString(String url) 
{ 
    try { 
      URL url1 = new URL(url); 
      URLConnection tc = url1.openConnection(); 
      tc.setConnectTimeout(timeout); 
      tc.setReadTimeout(timeout); 
      // tc.connect(); 
      br = new BufferedReader((new InputStreamReader(tc.getInputStream())),8000); 
      while ((line = br.readLine()) != null) { 
        sb.append(line+"\n"); 
       } 
       br.close(); 
       json = sb.toString(); 
       return json; 
     } 
    catch(Exception e) 
    { 
     Log.e("JSON Downloader", "Error downloading feed/article "); 
     e.printStackTrace(); 
    } 

    return null; 
} 

त्रुटि लॉग:

02-01 06:37:43.375: W/System.err(5548): java.net.SocketTimeoutException 
02-01 06:37:43.375: W/System.err(5548):  at java.net.PlainSocketImpl.read(PlainSocketImpl.java:491) 
02-01 06:37:43.375: W/System.err(5548):  at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
02-01 06:37:43.375: W/System.err(5548):  at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
02-01 06:37:43.375: W/System.err(5548):  at java.io.InputStream.read(InputStream.java:163) 
02-01 06:37:43.375: W/System.err(5548):  at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142) 
02-01 06:37:43.375: W/System.err(5548):  at java.io.BufferedInputStream.read(BufferedInputStream.java:227) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.io.Streams.readAsciiLine(Streams.java:201) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:544) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:784) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
02-01 06:37:43.375: W/System.err(5548):  at com.in.feeds.JSONDownloader.getJSONString(JSONDownloader.java:65) 
02-01 06:37:43.375: W/System.err(5548):  at com.in.feeds.JSONDownloader.getJSONObjectFromUrl(JSONDownloader.java:45) 
02-01 06:37:43.375: W/System.err(5548):  at com.in.fullarticle.ArticlePage$LoadArticle.run(ArticlePage.java:383) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
02-01 06:37:43.375: W/System.err(5548):  at java.lang.Thread.run(Thread.java:856) 

उत्तर

1

यह कुछ समय मैं इस के साथ काम किया है, लेकिन एक लेख वास्तव में जब प्रदर्शन की तलाश में पढ़ने के लिए सिफारिश की है: http://www.kegel.com/java/wp-javaio.html

कनेक्शन समयबाह्य सकता है सर्वर पक्ष पर होने के कारण, यह मानते हुए कि आप किसी वेब सर्वर से कनेक्ट हैं, जांचें कि आपको वहां कौन सी त्रुटियां मिलती हैं।

जीसी विवरण आश्चर्यजनक नहीं हैं। यह एक स्मृति रिसाव नहीं है, लेकिन जावा सफाई। उपरोक्त लेख से:

सबसे पहले, अगर हम, जबकि पाश की पहली पंक्ति को देखो, हम देखते हैं कि एक नया स्ट्रिंग ऑब्जेक्ट पढ़ा जा रहा फ़ाइल के हर लाइन के लिए बनाया जा रहा है:

जबकि ((लाइन = in.readLine())! = शून्य) {

इसका मतलब है, उदाहरण के लिए, 100,000 लाइन फ़ाइल के लिए 100,000 स्ट्रिंग ऑब्जेक्ट्स बनाए जाएंगे। वस्तुओं की एक बड़ी संख्या बनाने से लागत तीन तरीकों से होती है: वस्तुओं के लिए स्थान आवंटित करने के लिए समय और स्मृति, वस्तुओं को शुरू करने का समय, कचरे का समय वस्तुओं को इकट्ठा करना।

एकाधिक थ्रेडिंग के संबंध में, आपको थोड़ा और कोड प्रदान करना चाहिए। आपकी विधि सिंक्रनाइज़ है, इसलिए आप एक ही समय में एक ही उदाहरण पर कम से कम कई आमंत्रणों से बचें। एनडब्ल्यू कोड, त्वरित नज़र में, सुरक्षित है।

मेरी डीबग रणनीति सर्वर की ओर पहली बार और दूसरी स्टोर टाइमस्टैम्प को देखने के लिए होगी जब आपको इनपुट की एक पंक्ति मिलती है ताकि यह देखने के लिए कि क्या अंतराल होते हैं (ट्रांसमिशन त्रुटियां)।

शुभकामनाएं