2012-03-09 14 views
5

मैं Android अनुप्रयोग विकास के लिए नया हूँ और Async कार्यों के साथ एक समस्या हो रही थी। तो मैं एक ईसीजी ग्राफिंग एप्लिकेशन बनाने की कोशिश कर रहा हूं जो ग्राफ़िंग होने पर कुछ पृष्ठभूमि प्रसंस्करण करता है।एंड्रॉयड Async कार्य मेरी यूआई धागा धीमा

मैं निम्नलिखित Async कार्य परिभाषित किया है - (कम से मुझे नहीं यूआई अद्यतन करने की आवश्यकता -

private class Erosion extends AsyncTask <Void,Void,Void> { 


    @Override 
    protected Void doInBackground(Void...unused) { 

     int i,tempIndex; 
     double[] tempArray = new double[13]; 
     double min = ecgSamples[ecgSampleForErosionIndex] - gArray[0]; 
     while (ecgIncoming) 
     { 
      if (ecgSampleForErosionIndex > 179999) 
      { 
       ecgSampleForErosionIndex = 0; 
      } 

      for(i= 0;i<13;i++) 
      { 
       tempIndex = ecgSampleForErosionIndex + i; 
       if (tempIndex > 179999) 
       { 
        tempIndex = (ecgSampleForErosionIndex + i) - 180000; 
       } 
       tempArray[i] = ecgSamples[tempIndex] - gArray[i]; 
       if (tempArray[i] < min) 
       { 
        min = tempArray[i]; 
       } 

      } 

      //min needs to be stored in the erosionFirst Array 

      if (erosionFirstArrayIndex > 179999) 
      { 
       erosionFirstArrayIndex = 0; 
      } 


      ecgErosion[erosionFirstArrayIndex] = min; 
      erosionFirstArrayIndex++; 
      ecgSampleForErosionIndex++; 


     } 
     return null; 


    } 

    } //End of Async Task 

तो सब मुझे क्या करना कोशिश कर रहा हूँ async कार्य में एक विशेष सरणी की सामग्री को संशोधित है कम से कम नहीं अब के लिए)

हालांकि, जब मैं इस async कार्य मेरी ईसीजी रेखांकन धीमा और झटकेदार हो जाता है चलाते हैं। जब मैं "नया क्षरण() निष्पादित करता हूं (निष्पादित करता हूं);" कोड में भाग जहां मैं Async कार्य शुरू करता हूं, ग्राफिंग फिर से सामान्य हो जाता है।

एक async कार्य एक अलग थ्रेड पर होना चाहिए नहीं है और इतने प्रभावित नहीं कैसे चीजें मेरी यूआई धागे पर हो रही हैं? मैं क्या गलत कर रहा हूं?

उत्तर

8

भले ही आप पृष्ठभूमि थ्रेड पर कोड का एक भारी टुकड़ा चलाते हैं, फिर भी यह डिवाइस के सीपीयू लोड को प्रभावित करेगा और इसलिए आपके यूआई थ्रेड में भी देरी हो सकती है, विशेष रूप से यदि डिवाइस में एकल-कोर CPU है।

ऐसा लगता है कि आप में आप doInBackground विधि है, जो लगातार चलता है और सिर्फ सीपीयू लगातार है, जो यह overloads का उपयोग एक बहुत भारी पाश की है। मुझे यकीन है कि क्या इस पाश के लिए है नहीं कर रहा हूँ, लेकिन आप, एक धागा नींद जोड़ने पर विचार करना चाह सकते हैं, तो यह लगातार ताज़ा करने के लिए नहीं है अन्य धागे अधिक CPU समय प्राप्त करने के लिए अनुमति देता है:

while (ecgIncoming) 
    { 
     ... do your thing ... 
     Thread.sleep(100); // wait for 100 milliseconds before running another loop 
    } 

जाहिर है " 100 "सिर्फ एक संख्या है, तो सरणी एक बार एक दूसरे को अपडेट कर सकते है, यह एक 1000, आदि ...

+0

हाँ, मैं लगातार एसिंक कार्य चला रहा हूं क्योंकि मैं वास्तविक समय में हृदय गति की गणना करने के लिए ईसीजी डेटा का उपयोग कर रहा हूं। यह काम की भारी मात्रा में चल रहा है - इसलिए मुझे लगता है कि आपकी व्याख्या समझ में आता है। क्या असींक कार्य के अलावा कुछ और है जो मैं निरंतर पृष्ठभूमि गणना कार्य करने के लिए उपयोग कर सकता हूं? – stu90

+3

@ stu90: "क्या असींक कार्य के अलावा कुछ और है जो मैं निरंतर पृष्ठभूमि गणना कार्य करने के लिए उपयोग कर सकता हूं?" - कुछ भी नहीं जो आपकी समस्या को बदल देगा। वह थ्रेड पहले ही पृष्ठभूमि प्राथमिकता पर सेट है, लेकिन यह आपके व्यस्त लूप के साथ बहुत मदद नहीं करेगा। इस तरह व्यस्त लूप्स को कुछ दशकों तक खराब रूप माना जाता है। आपको नमूनाकरण दर स्थापित करने की आवश्यकता है और अन्य धागे को सीपीयू पर मौका देने की इजाजत है, क्योंकि तलीहॉक सुझाव देते हैं। 'AsyncTask' पूल से अनिश्चित काल तक एक धागा बांधने के बजाय, आप अपने स्वयं के धागे को फोर्किंग करने के लिए भी बेहतर सेवा प्रदान करते हैं। – CommonsWare

+0

@ stu90 आप एक Async कार्य के बजाय एक सेवा का उपयोग कर सकते हैं, लेकिन मुझे संदेह है कि अकेले प्रदर्शन में काफी अंतर आएगा। आप उस सेवा को एक अलग लिनक्स प्रक्रिया पर चलाने के लिए साइन आउट कर सकते हैं, लेकिन फिर मैं यह नहीं कह सकता कि इससे कोई फर्क नहीं पड़ता या नहीं। यह आपको प्रारंभ करने में मदद कर सकता है हालांकि: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html – elevine

0

कोई मौका करके आप new Erosion().execute(); कई बार चल रहे हैं? इसका कारण यह हो सकता है क्योंकि आप कई बार AsyncTask आवंटित कर रहे हैं।

+0

नहीं बस एक बार! लेकिन यह पृष्ठभूमि में वास्तव में लंबी अवधि के लिए चलता है .. तो मुझे लगता है कि यही कारण है कि यह बहुत अधिक CPU संसाधनों को ले रहा है। – stu90

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