2010-07-12 42 views
7

मुझे एक एंड्रॉइड एप्लिकेशन में आवधिक कार्य चलाने की जरूरत है।एंड्रॉइड सिस्टम घड़ी बदलना टाइमर बंद कर देता है। मैं उन्हें कैसे पुनरारंभ कर सकता हूं?

final Handler guiHandler = new Handler(); 

// the task to run 
final Runnable myRunnable = new Runnable() { 

    @Override 
    public void run() { 
     doMyStuff(); 
    } 
}; 

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 

    @Override 
    public void run() { 
     guiHandler.post(myRunnable); 
    } 
}, 0, 30000); // run every 30 seconds 

यह ठीक करता है कि मैं क्या जरूरत है, लेकिन वहाँ एक समस्या है: अगर मैं एमुलेटर या फोन पर समय बदलने के लिए, टाइमर चल रहा बंद हो जाता है मैं इस समय इस तरह एक टाइमर का उपयोग करें। यह वही है लॉग में प्रकट होता है जब मैं समय बदल रहा है:

D/SystemClock( 331): Setting time of day to sec=1278920137 
W/SystemClock( 331): Unable to set rtc to 1278920137: Invalid argument 

टाइमर के बारे में कुछ भी नहीं है बाधित किया जा रहा है, लेकिन यह स्पष्ट रूप से अब के बाद सिस्टम घड़ी बदल गया है नहीं चलता है। जब तक एप्लिकेशन चल रहा है, तब तक मुझे हर समय चलने के लिए काम की ज़रूरत है।

टाइमर को फिर से कैसे शुरू किया जा सकता है यदि यह इस तरह बंद हो जाता है? यह जांचने के लिए टाइमर या टाइमरटास्क पर कोई विधि नहीं है कि यह वर्तमान में चल रहा है या नहीं, इसलिए मुझे नहीं पता कि इसे फिर से निर्धारित करना है या नहीं। कोई विचार?

उत्तर

3

मुझे लगता है कि ऐसा करने के कुछ तरीके हैं। मैं किसी भी मामले में टाइमर का उपयोग नहीं करता।

आप एक पोस्टडेल कॉल में अपना काम चलाने के लिए एक हैंडलर का उपयोग कर सकते हैं। तब आपके काम को अपने आप से हैंडलर के साथ फिर से पंजीकृत करना होगा।

final int ONE_SECOND = 1000; // one second 
final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    public void run() { 
     ... // do some stuff 
     if (expression) { 
     handler.postDelayed(this, ONE_SECOND); 
     } 
    } 
}, ONE_SECOND); 

यह आपके ऐप को जीवंत होने पर कार्य को जारी रखेगा। आप रननेबल के भीतर पोस्ट किए गए पोस्ट में देरी दर को भी समायोजित कर सकते हैं। इस तरह से अर्द्ध अनुमानित है जब तक आप एक और लूपर बनाते हैं। मुख्य थ्रेड का उपयोग करना या क्या काम है के आधार पर उचित नहीं हो सकता है हो सकता है।

भी एक AlarmManager नहीं है, कि आप संदर्भ इंटरफ़ेस है, जो और अधिक सटीक अंतराल पर कार्य कार्य आवर्ती के लिए है के माध्यम से करने के लिए पहुँच प्राप्त कर सकते हैं। यह एक छोटे से अधिक उपयोग करने के लिए जटिल है, लेकिन आप आरटीसी के उपयोग होने का लचीलापन मिलता है और repeatable कार्यों बनाए।

AlarmManager manager = mContext.getSystemService(Context.ALARM_SERVICE); 
manager.setRepeating(AlarmManager.RTC, 
    <start_time_millis>, 
    <period_millis>, 
    pendingIntent); 

उदाहरण के लिए, लंबित इरादा प्रसारण प्रसारण को आग लगा सकता है जिसे आप कहीं और सुन सकते हैं। आप अपने कस्टम आवेदन वस्तु की onCreate में इस pendingintent बना सकते हैं और onTerminate में आशय रद्द कर सकते हैं()।

+0

इस महान समाधान है कि मैं देख रहा हूँ है! धन्यवाद – JosephT

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