मैं 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 कार्य एक अलग थ्रेड पर होना चाहिए नहीं है और इतने प्रभावित नहीं कैसे चीजें मेरी यूआई धागे पर हो रही हैं? मैं क्या गलत कर रहा हूं?
हाँ, मैं लगातार एसिंक कार्य चला रहा हूं क्योंकि मैं वास्तविक समय में हृदय गति की गणना करने के लिए ईसीजी डेटा का उपयोग कर रहा हूं। यह काम की भारी मात्रा में चल रहा है - इसलिए मुझे लगता है कि आपकी व्याख्या समझ में आता है। क्या असींक कार्य के अलावा कुछ और है जो मैं निरंतर पृष्ठभूमि गणना कार्य करने के लिए उपयोग कर सकता हूं? – stu90
@ stu90: "क्या असींक कार्य के अलावा कुछ और है जो मैं निरंतर पृष्ठभूमि गणना कार्य करने के लिए उपयोग कर सकता हूं?" - कुछ भी नहीं जो आपकी समस्या को बदल देगा। वह थ्रेड पहले ही पृष्ठभूमि प्राथमिकता पर सेट है, लेकिन यह आपके व्यस्त लूप के साथ बहुत मदद नहीं करेगा। इस तरह व्यस्त लूप्स को कुछ दशकों तक खराब रूप माना जाता है। आपको नमूनाकरण दर स्थापित करने की आवश्यकता है और अन्य धागे को सीपीयू पर मौका देने की इजाजत है, क्योंकि तलीहॉक सुझाव देते हैं। 'AsyncTask' पूल से अनिश्चित काल तक एक धागा बांधने के बजाय, आप अपने स्वयं के धागे को फोर्किंग करने के लिए भी बेहतर सेवा प्रदान करते हैं। – CommonsWare
@ stu90 आप एक Async कार्य के बजाय एक सेवा का उपयोग कर सकते हैं, लेकिन मुझे संदेह है कि अकेले प्रदर्शन में काफी अंतर आएगा। आप उस सेवा को एक अलग लिनक्स प्रक्रिया पर चलाने के लिए साइन आउट कर सकते हैं, लेकिन फिर मैं यह नहीं कह सकता कि इससे कोई फर्क नहीं पड़ता या नहीं। यह आपको प्रारंभ करने में मदद कर सकता है हालांकि: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html – elevine