2010-01-29 11 views
37

मैं वर्तमान में अपने एंड्रॉइड एप्लिकेशन में एक वाईफाई स्कैन स्थापित करने की कोशिश कर रहा हूं जो हर 30 सेकंड में वाईफाई एक्सेस पॉइंट्स के लिए स्कैन करता है।एंड्रॉइड - टाइमर और टाइमर टास्क के साथ एक कार्य को नियंत्रित करना?

मैंने टाइमर और टाइमरटास्क का उपयोग किया है ताकि स्कैन को अंतराल पर सही तरीके से चलने के लिए उपयोग किया जा सके।

हालांकि मैं उपयोगकर्ता को बटन दबाते समय स्कैनिंग को रोकने और स्कैनिंग शुरू करने में सक्षम होना चाहता हूं और मुझे वर्तमान में परेशानी हो रही है और फिर टाइमर और टाइमरटास्क को पुनरारंभ करना है।

यहाँ मेरी कोड

TimerTask scanTask; 
final Handler handler = new Handler(); 
Timer t = new Timer(); 

public void doWifiScan(){ 

scanTask = new TimerTask() { 
     public void run() { 
       handler.post(new Runnable() { 
         public void run() { 
         wifiManager.scan(context); 
         Log.d("TIMER", "Timer set off"); 
         } 
       }); 
     }}; 


    t.schedule(scanTask, 300, 30000); 

} 

    public void stopScan(){ 

    if(scanTask!=null){ 
     Log.d("TIMER", "timer canceled"); 
     scanTask.cancel(); 
} 

} 

है तो टाइमर और कार्य ठीक शुरू करने और स्कैन हर 30 सेकंड होता है लेकिन मैं नहीं कर सकते इसे रोकने के लिए मिलता है, मैं टाइमर बंद कर सकते हैं, लेकिन कार्य अभी भी होता है और scanTask। रद्द करें() या तो काम नहीं कर रहा है।

क्या ऐसा करने का कोई बेहतर तरीका है? या क्या मैं टाइमर/टाइमर टास्क कक्षाओं में कुछ खो रहा हूं?

उत्तर

26

आप सोच सकते हैं:

  • , अपने कार्य पर cancel() कॉल करने से बूलियन परिणाम की जांच के रूप में यह संकेत देना चाहिए कि यदि आपके अनुरोध सफल होता है या विफल रहता है
  • TimerTask
  • के बजाय Timer पर purge() या cancel() प्रयास करें

यदि आपको आवश्यक रूप से Timer और TimerTask की आवश्यकता नहीं है, तो आप हमेशा postDelayed() का उपयोग करें (हैंडलर पर उपलब्ध है और किसी भी View पर)। यह देरी के बाद यूआई थ्रेड पर निष्पादित करने के लिए Runnable शेड्यूल करेगा। इसे दोबारा शुरू करने के लिए, बस अपने आवधिक काम करने के बाद इसे फिर से निर्धारित करें। फिर यह प्रक्रिया समाप्त होने पर इंगित करने के लिए आप एक बूलियन ध्वज की निगरानी कर सकते हैं। उदाहरण के लिए:

private Runnable onEverySecond=new Runnable() { 
    public void run() { 
     // do real work here 

     if (!isPaused) { 
      someLikelyWidget.postDelayed(onEverySecond, 1000); 
     } 
    } 
}; 
+0

मैं इस बूलियन तरह scanTask पर बूलियन जाँच करने की कोशिश की टीएफ = स्कैनटास्क.cancel(); लेकिन अब मुझे उस रेखा पर एक नल सूचक अपवाद मिलता है। हालांकि कार्य स्वयं ठीक चल रहा है ?? मैं अंततः सेवा में कोड चला रहा हूं, तो पोस्टडेलड का उपयोग करना एक विकल्प होगा? –

+0

जाहिर है, 'स्कैनटास्क' को' शून्य 'पर रीसेट किया जा रहा है, और आपके द्वारा प्रस्तुत कोड खंडों से यह कहना असंभव है कि क्यों या नहीं। 'postDelayed() '' सेवा' में कोई विकल्प नहीं है, लेकिन यह स्पष्ट नहीं है कि आप इस मामले में' सेवा 'क्यों चाहते हैं। – CommonsWare

+0

पूरे एप्लिकेशन के कोड में कहीं भी स्कैनटास्क का उपयोग नहीं किया जाता है, न ही टाइमर है, जो मैंने पोस्ट किया है वह टाइमर टी और टाइमरटास्क स्कैनटास्क का पूरा उपयोग है। मैं एंड्रॉइड के बारे में पढ़ने से कम से कम यूआई के साथ एक एप्लीकेशन बनाना चाहता हूं, यह सेवा करने का तरीका है? –

5

एंड्रॉइड प्रलेखन का कहना है कि रद्द करें() टाइमर और सभी निर्धारित कार्यों को रद्द करता है। यदि वर्तमान में चल रहे कार्य हैं तो यह प्रभावित नहीं होता है। इस टाइमर पर कोई और कार्य निर्धारित नहीं किया जा सकता है। बाद की कॉल कुछ भी नहीं करते हैं। जो इस मुद्दे को बताता है।

6

अपने कोड का उपयोग, बजाय

scanTask.cancel(); 

सही तरीके से अपने टाइमर (नहीं timerTask) को रद्द करने के है:

t.cancel(); 
संबंधित मुद्दे