2012-11-06 10 views
10

मेरे पास एक हस्तलेख पहचान एप है - उपयोगकर्ता अपनी उंगली से खींचता है, ऐप पात्रों को पहचानता है। मान्यता इंजन एक कार्यकर्ता थ्रेड में चलता है जिसमें न्यूनतम संभव प्राथमिकता होती है - Thread.MIN_PRIORITY। यह पूरी तरह से सीपीयू/मेमोरी एल्गोरिदम है, नहीं I/O जो भी हो। फिर भी, जब धागा सक्रिय रूप से काम कर रहा है, तो यूआई बल्कि चंचल हो जाता है। उंगली स्ट्रोक दिखाई देने में एक देरी देरी लेते हैं। मैं भी स्पर्श घटनाओं को खोने की सूचना देता हूं।जब कार्यकर्ता धागा काम करता है, यूआई चकाचौंध हो जाता है

क्या यह नहीं है कि वास्तव में क्या थ्रेडिंग से बचने में मदद की जानी चाहिए? यूआई थ्रेड सीपीयू के लिए भूखा क्यों है? सिस्टम को वर्कर थ्रेड के साथ-साथ कम प्राथमिकता वाले पृष्ठभूमि थ्रेड के रूप में समझने के लिए कैसे मनाया जाता है?

ऐसा लगता है कि सिस्टम शुरू हो रहा है (स्वेच्छा से या सीपीयू भुखमरी के कारण) invalidate() और onDraw() के बीच देरी। क्या मैं किसी देरी को उस देरी को कम कर सकता हूं?

अपेक्षाकृत पुराने हार्डवेयर पर परीक्षण - एंड्रॉइड 2.1 के साथ एचटीसी जादू। वर्ण पहचान विधि में मुख्य चक्र में Thread.sleep(1) जोड़ने के लिए

उत्तर

4

एक ही समस्या थी, इसलिए मैं अपने धागा बनाया: काम का एक हिस्सा संसाधित करने के बाद

  1. Thread.yield()।

  2. लिमिटेड अद्यतन एक मिनट 500 एमएस अंतराल के साथ यूआई धागा पर पोस्ट किए गए (बहुत कम फिर से ड्रॉ के कारण)।

  3. निर्मित डेटा की प्राथमिकता के आधार पर बाल्टी पर कार्यकर्ता काम करते हैं, इस बार देखा गया अद्यतन करने पर केंद्रित है, उपयोगकर्ता वर्तमान के साथ बातचीत कर रहा है।

अब पूरा यूआई वास्तव में आलसी है, लेकिन अंतराल से मुक्त है।

यहाँ मेरी कार्यकर्ता शेड्यूलिंग विधि की तरह (वास्तविक कार्य प्रक्रिया विधि द्वारा किया जाता है) दिखता है:

//--low priority 
Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 

//--as long as there's more work to do, and not cancelled-- 
while (mPriorityBuffer.hasNext() && !isCancelled()) { 

    //--get the work with highest priority-- 
    Work next = mPriorityBuffer.getNext(); 

    //--do work-- 
    Update u = mProcessor.process(next); 

    // collect updates for main thread 
    mUpdates.push(u); 

    long timeNow = Calendar.getInstance().getTimeInMillis(); 
    if(timeNow - timeLast > 500){ 
     //--its been quite a while now, update ui-- 
     postUpdatesToMainThread(); 
     timeLast = timeNow; 
    } 

    //--let UI thread work on updates-- 
    Thread.yield(); 
} 
+0

समय-समय पर पैदावार का सबसे अच्छा प्रभाव पड़ा। –

+0

हाय एसडी, क्या आप इस कोड ब्लॉक में इंडेंटेशन को ठीक कर सकते हैं? साथ ही, क्या आप सिंटैक्स हाइलाइटर को यह सोचने से रोकने के लिए एक [भाषा टैग] (http://meta.stackexchange.com/a/75019/321006) जोड़ने का प्रयास कर सकते हैं कि उपज एक कीवर्ड है? मुझे लगता है कि ऑटो हाइलाइटर ने माना कि यह सी # कोड था। – jrh

2

कोशिश

@Override 
public void run() { 
    while (!recognited) { 

    //do some script 

    try { 
     Thread.sleep(1); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

इस नींद थोड़ा जल्दी अन्य धागा फिर से शुरू करने और अक्सर

+0

यह मान्यता प्राप्त नहीं लिखा जाता है, btw। एक थ्रेड.इल्ड भी मदद कर सकता है, हालांकि मैंने कभी नहीं देखा कि इसका कोई वास्तविक प्रभाव पड़ा है। – njzk2

+1

उपज बेहतर काम करता है, ऐसा लगता है। फिर भी, +1। –

1

यह संभव है कि अपने GUI धागे से floaded है आभासी मशीन की सुविधा देता है घटनाओं को स्पर्श करें, यदि ऐसा है तो समाधान यूआई थ्रेड पर कुछ एमएस इंतजार करना और अपने कार्यकर्ता धागे को बढ़ावा देना है। यह यहाँ पर अधिक:

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/Oe6k1_bm38o

भी, शायद आप की तरह अगर कोई आंदोलन वास्तव में happend, या आंदोलन इतना अधिक नहीं होता है बहुत अधिक डेटा, कार्रवाई कर रहे हैं।

+0

चर्चा में प्रासंगिक सलाह - स्पर्श प्रेषण को 'प्रेषण टचवेन्ट' में ले जाएं। –

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