2012-07-24 14 views
11

के भीतर दोहराए गए थ्रेड को चलाएं सबसे पहले, मैं उपयोग करने की विधि भी नहीं चुन सका, मैं अब घंटों के लिए पढ़ रहा हूं और कोई कहता है 'हैंडलर' का उपयोग करते हैं, कोई कहता है 'टाइमर'। यहां मैं प्राप्त करने का प्रयास करता हूं:एंड्रॉइड - एक टाइमर

वरीयताओं पर, एक सेटिंग (चेकबॉक्स) है जो दोहराने वाली नौकरी को सक्षम/अक्षम करने के लिए है। चूंकि चेकबॉक्स चेक किया गया है, टाइमर काम करना शुरू कर देना चाहिए और थ्रेड को हर एक्स सेकंड निष्पादित किया जाना चाहिए। चूंकि चेकबॉक्स अनचेक किया गया है, टाइमर बंद होना चाहिए।

जांच की जा रही है कि क्या करता है, तो चेकबॉक्स या चेक नहीं किया गया है, अगर जाँच की 'refreshAllServers' शून्य निष्पादित किया जाएगा जो टाइमर के साथ काम करता है:

यहाँ मेरी कोड है।

boolean CheckboxPreference = prefs.getBoolean("checkboxPref", true); 
       if(CheckboxPreference == true) { 
        Main main = new Main(); 
        main.refreshAllServers("start"); 
       } else { 
        Main main = new Main(); 
        main.refreshAllServers("stop"); 
       } 

refreshAllServers शून्य कि टाइमर काम करता है:

public void refreshAllServers(String start) { 

    if(start == "start") { 

     // Start the timer which will repeatingly execute the thread 

    } else { 

     // stop the timer 

      } 

और यहाँ कैसे मैं अपने धागा निष्पादित है: (घड़ी के बिना अच्छी तरह से काम करता है)

Thread myThread = new MyThread(-5); 
       myThread.start(); 

मैं क्या करने की कोशिश की?

मैंने Google (हैंडलर, टाइमर) से देखे गए किसी भी उदाहरण की कोशिश की, उनमें से कोई भी काम नहीं किया, मैं टाइमर शुरू करने में कामयाब रहा लेकिन इसे रोकने से काम नहीं हुआ। simpliest & समझा जा सकता कोड मैं अपने अनुसंधान के क्षेत्र में देखा यह गया था:

new java.util.Timer().schedule( 
     new java.util.TimerTask() { 
      @Override 
      public void run() { 
       // your code here 
      } 
     }, 
     5000 
); 
+1

देखने के लिए कि इस सवाल का जवाब [यहां] (http://stackoverflow.com/questions/8098806/where-do-i-create-and-use-scheduledthreadpoolexecutor-timertask-or-handler/8102488#8102488) मदद करता है. – yorkw

उत्तर

34

बस बस नीचे दिए गए का उपयोग झलकी

private Handler handler = new Handler(); 
private Runnable runnable = new Runnable() { 
    public void run() { 
     // 
     // Do the stuff 
     // 

     handler.postDelayed(this, 1000); 
    } 
}; 
runnable.run(); 

को रोकने के लिए यह

handler.removeCallbacks(runnable); 

का उपयोग चाल करना चाहिए।

+0

आपका समाधान भी अच्छा काम करता है, क्योंकि मुझे कुछ अन्य समाधान मिला। – sarkolata

+0

मुझे लगता है कि यह सबसे अच्छा समाधान है। –

+2

क्या होगा यदि उपयोगकर्ता कुछ ऐसा करना चाहता है जो इंटरनेट से कनेक्शन का उपयोग करता हो? उपरोक्त को लागू करने से यूआई थ्रेड पर हैंडलर और रननेबल रन बन जाएगा, जो किसी भी नेटवर्क चीजों को रोकता है। आपको वहां धागे को लागू करने की आवश्यकता है। – tony9099

1

मैं AlarmManager http://developer.android.com/reference/android/app/AlarmManager.html

उपयोग करने के लिए चेकबॉक्स कॉल पद्धति पर है जहां

AlarmManager alarmManager = (AlarmManager)SecureDocApplication.getContext() 
    .getSystemService(Context.ALARM_SERVICE); 
PendingIntent myService = PendingIntent.getService(context, 0, 
       new Intent(context, MyService.class), 0); 

long triggerAtTime = 1000; 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, 5000 /* 5 sec*/, 
       myService); 

चेकबॉक्स बंद है लगता होगा अलार्म प्रबंधक रद्द करें

alarmManager.cancel(myService); 
+0

और कौन सा हिस्सा है कि मैं अपना कोड डालेगा? – sarkolata

+1

एक क्लास सदस्य चर है जो अलार्म प्रबंधक का उदाहरण है। जब चेकबॉक्स उस कोड के साथ एक विधि कॉल पर है। जब अलार्म प्रबंधक को बंद करने के लिए कॉल विधि बंद करें। यह तब होता है जब उपयोगकर्ता गतिविधियों के माध्यम से ब्राउज़ करता है, फिर विरासत में आवेदन कक्षा में। यदि उपयोगकर्ता ऐप से बाहर निकल सकता है और फिर भी सेवा में चलने की आवश्यकता है। – Maxim

1

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

CountDownTimer myCountdownTimer = new CountDownTimer(30000, 1000) { 

public void onTick(long millisUntilFinished) { 
    mTextField.setText("seconds remaining: " + millisUntilFinished/1000); 
    // Kick off your AsyncTask here. 
} 

public void onFinish() { 
    mTextField.setText("done!"); 
    // the 30 seconds is up now so do make any checks you need here. 
} 
}.start(); 
+0

यह चीज दोहराता नहीं है। यह एक बार फिर बंद कर दिया! – sarkolata

+0

हां यह अनिश्चित काल तक नहीं चलता है। यदि आप इसे अनिश्चित काल तक चलाना चाहते हैं तो आप पृष्ठभूमि सेवा पर विचार कर सकते हैं। दूसरी तरफ, यदि स्थिति सही है, या लंबी अवधि निर्धारित करने से आपको उलटी गिनती टाइमर को पुनरारंभ करने से रोकने के लिए कुछ भी नहीं है। –

2

सभी के लिए धन्यवाद, मैंने टाइमर का उपयोग करने के साथ इस मुद्दे को ठीक किया।

   timer = new Timer(); 
      timer.scheduleAtFixedRate( 
         new java.util.TimerTask() { 
          @Override 
          public void run() { 
           for(int i = 0; i < server_amount; i++) { 
             servers[i] = "Updating...";          handler.sendEmptyMessage(0); 
             new MyThread(i); 
             myThread.start(); 
         } 


        }}, 
        2000, 5000 
        ); 
+0

कृपया दूसरों के ऊपर इस समाधान के फायदे बताएं। मैं इसे देख नहीं रहा हूँ। –

+0

कोई फायदे नहीं, मुझे पता चला कि मेरे काम करने के बाद कोडर्स पैराडाइज का जवाब भी काम कर रहा है। – sarkolata

0

"[ScheduledThreadPoolExecutor] वर्ग टाइमर के लिए बेहतर जब कई कार्यकर्ता धागे की जरूरत है, या जब ThreadPoolExecutor (जो इस वर्ग का विस्तार) के अतिरिक्त लचीलापन या क्षमताओं की आवश्यकता है।"

प्रति ...

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html

यह हैंडलर तुलना में बहुत अधिक नहीं है, लेकिन वास्तव में हर बार चलाने का विकल्प (उपाध्यक्ष प्रत्येक गणना पूरी होने के बाद एक देरी) है।

import java.util.concurrent.ScheduledThreadPoolExecutor; 
import java.util.concurrent.TimeUnit; 


... 


final int THREAD_POOL_SIZE = 10; 
final int START_DELAY = 0; 
final int TIME_PERIOD = 5; 
final TimeUnit TIME_UNIT = TimeUnit.SECONDS; 

ScheduledThreadPoolExecutor pool; 

Runnable myPeriodicThread = new Runnable() { 
    @Override 
    public void run() { 
     refreshAllServers(); 
    } 
}; 


public void startTimer(){ 

    pool.scheduleAtFixedRate(myPeriodicThread, 
      START_DELAY, 
      TIME_PERIOD, 
      TIME_UNIT); 

} 

public void stopTimer(){ 

    pool.shutdownNow(); 

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