2015-10-13 13 views
8

का उपयोग करते समय सभी धागे को लटकता है और निलंबित करता है मैं वेबसाइट की सामग्री प्राप्त करने के लिए AsyncTask कक्षा का उपयोग करने का प्रयास कर रहा हूं। लॉगकैट मुझे बार-बार W/art: Suspending all threads took: 15(or any other number)ms बताता है। मेरा संदेश जमे हुए है जब तक कि लॉग संदेश प्रिंट नहीं किए जाते हैं। यूआई लॉग के बाद दिखाता है। मैंने एक ट्यूटोरियल का पालन किया और दो बार जांच की है कि मेरा कोड ट्यूटोरियल जैसा ही होना चाहिए। थोड़ी देर के बाद, यह वेबसाइट से कोड की कुछ पंक्तियों को लॉग करता है, लेकिन कुछ भी नहीं। मैंने विभिन्न वेबसाइटों के साथ भी कोशिश की।एप्लिकेशन AsyncTask

public class MainActivity extends AppCompatActivity { 

    public class DownloadTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... urls) { 

      String result = ""; 
      URL url; 
      HttpURLConnection urlConnection = null; 

      try { 

       url = new URL(urls[0]); 

       urlConnection = (HttpURLConnection) url.openConnection(); 

       InputStream in = urlConnection.getInputStream(); 

       InputStreamReader reader = new InputStreamReader(in); 

       int data = reader.read(); 

       while (data != -1) { 

        char current = (char) data; 

        result += current; 

        data = reader.read(); 

       } 

       return result; 

      } catch (Exception e) { 

       e.printStackTrace(); 

      } 

      return null; 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     DownloadTask task = new DownloadTask(); 
     String result = null; 

     try { 

      result = task.execute("http://www.vg.no/").get(); 

      Log.i("URL content" , result); 

     } catch (InterruptedException e) { 

      e.printStackTrace(); 

     } catch (ExecutionException e) { 

      e.printStackTrace(); 

     } 

    } 


} 

उत्तर

15

निम्न पंक्ति एक समस्या है:

result = task.execute("http://www.vg.no/").get();

इस बयान के .get() भाग का अर्थ है "जब तक काम पूरा करता है इंतज़ार" यहाँ मेरी AsyncTask है। कार्य निष्पादित करते समय यह यूआई थ्रेड को प्रभावी ढंग से अवरुद्ध करता है।

बस पृष्ठभूमि कार्य को अपनी सामग्री दें और onPostExecute() के माध्यम से कोई परिणाम वापस प्राप्त करें। निम्नलिखित AsyncTask देखें:

public class MainActivity extends AppCompatActivity { 

    public class DownloadTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... urls) { 
      ... 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      Log.i("URL content" , result); 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     DownloadTask task = new DownloadTask(); 
     task.execute("http://www.vg.no/"); 
    } 


} 
+0

इस एप्लिकेशन को ठंड तय है, लेकिन मैं अभी भी सभी मिलती है: "डब्ल्यू/कला: सभी थ्रेडों को निलंबित करना: 9.850ms "लॉग में संदेश। मुझे यह भी मिलता है: "मैं/कला: पृष्ठभूमि आंशिक समवर्ती मार्क स्वीप जीसी ने 58 (2048 बी) ऑलोकस्पेस ऑब्जेक्ट्स, 45 (16 एमबी) एलओएस ऑब्जेक्ट्स, 40% फ्री, 21 एमबी/36 एमबी, 7.230 एमएमएस कुल 23.8 9 5 एमएमएस को रोक दिया" –

+5

@ EmilØgård इन सभी ऐप्स के लिए संदेश के प्रकार आम हैं और आपको चिंतित नहीं होना चाहिए। वे एंड्रॉइड फ्रेमवर्क लॉगिंग का हिस्सा हैं और स्मृति प्रबंधन के मुद्दों और डीबगिंग समस्याओं का निदान करने के लिए उपयोग किए जाते हैं। लगभग सभी ऐप्स में, उन्हें सुरक्षित रूप से अनदेखा किया जा सकता है (और आप उनसे छुटकारा नहीं पा सकते हैं)। – adelphus

+2

अधिक विशेष रूप से, "मार्क स्वीप जीसी" चीज रिपोर्ट कर रही है कि कचरा कलेक्टर स्मृति को पुनः प्राप्त करने के लिए क्या कर रहा है। "सभी धागे निलंबित" संदेश इसलिए है क्योंकि जब कचरा कलेक्टर अपना काम करता है तो सभी धागे को निलंबित कर दिया जाना चाहिए। इस विशेष स्वीप में 24 मिलीसेकंड, या आंखों के झपकी के दसवें हिस्से लगे। ;-) – nasch

2

सबसे पहले मुझे लगता है कि आपने AsyncTask का दुरुपयोग किया है। AsyncTask को अतुल्यकालिक रूप से get() का उपयोग करके सिंक्रनाइज़ नहीं किया जाना चाहिए।

आपको अपने AsyncTask के अंदर पोस्टस्टेक्स्यूट जोड़ना चाहिए और परिणाम प्राप्त करना चाहिए।

protected void onPostExecute(String result) { 
    //You could get the result here 
} 

आप यहाँ बेहतर ट्यूटोरियल पढ़ सकता है -> http://developer.android.com/reference/android/os/AsyncTask.html

-4

मैं इस तरह से एक ही समस्या मिला है। "जबकि" आपकी समस्या का कारण है, आपको इससे छुटकारा पाना होगा।

0

मैं वेबसाइट की सामग्री प्राप्त करने के लिए AsyncTask क्लास का उपयोग करने का प्रयास कर रहा हूं। लॉगकैट मुझे डब्ल्यू/कला बताता है: सभी धागे को निलंबित करने में लिया गया: 15 (या कोई अन्य नंबर) बार बार बार।

आपके पास AsyncTask के बेहतर विकल्प हैं।

developer.android.com द्वारा " थ्रेडिंग प्रदर्शन" लेख से

:

AsyncTask उपयोग करते समय, कुछ महत्वपूर्ण प्रदर्शन पहलुओं को ध्यान में रखना है। सबसे पहले, डिफ़ॉल्ट रूप से, एक ऐप सभी AsyncTask ऑब्जेक्ट्स को धक्का देता है जो इसे एक थ्रेड में बनाता है। इसलिए, वे धारावाहिक फैशन में निष्पादित होते हैं, और मुख्य धागे के साथ-साथ विशेष रूप से लंबे काम के पैकेट कतार को अवरुद्ध कर सकते हैं। इस कारण से, हम सुझाव देते हैं कि आप केवल अवधि में 5ms से कम कार्य वस्तुओं को संभालने के लिए AsyncTask का उपयोग करें।

आप एक विकल्प के रूप HandlerThread उपयोग कर सकते हैं।आप प्राप्त किया जा करने के लिए कई यूआरएल है, तो जाना ThreadPoolExecutor

के लिए संबंधित पोस्ट (रों) पर एक नज़र डालें:

Handler vs AsyncTask vs Thread