2012-04-18 13 views
28

मुझे नियमित अंतराल में कुछ कोड करने की आवश्यकता है (सर्वर से कनेक्ट करें और हर मिनट MySQL डेटाबेस से डेटा खींचें)। इस प्रयोजन के लिए मैं एक सिंक वर्ग है:एंड्रॉइड: नियमित अंतराल में कोड निष्पादित करें

public class Sync { 

    static private Handler handler = new Handler(); 
    Runnable task; 

    public Sync(Runnable task, long time) { 
     this.task = task; 
     handler.removeCallbacks(task); 
     handler.postDelayed(task, time); 
    } 
} 

और मेरी गतिविधि में मेरे पास है:

public void onCreate(Bundle savedInstanceState) { 
    ... 
    Sync sync = new Sync(call,60*1000); 
    ... 
} 

final private Runnable call = new Runnable() { 
    public void run() { 
    //This is where my sync code will be, but for testing purposes I only have a Log statement 
    Log.v("test","this will run every minute"); 
    } 
}; 

मैं परीक्षण के लिए एक कम समय अवधि के साथ इस की कोशिश की है, लेकिन यह केवल एक बार चलाता है। जब यह पहली बार संदेश लॉग करता है, तो यह भी आखिरी है। क्या कोई देखता है कि मैं यहाँ क्या कर रहा हूं? धन्यवाद!

+0

scheduleWithFixedDelay एक और विकल्प है। –

उत्तर

48

आप नीचे दिए गए कोड का उपयोग कर ऐसा कर सकते हैं, उम्मीद है कि यह मदद करता है!

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
     try{ 
      //do your code here 
     } 
     catch (Exception e) { 
      // TODO: handle exception 
     } 
     finally{ 
      //also call the same runnable to call it at regular interval 
      handler.postDelayed(this, 1000); 
     } 
    } 
}; 
+2

हाँ यह वही है जो मैं कहने जा रहा था। अलार्ममेनगर भारी है और आपके रननेबल को ट्रिगर करने के लिए इरादे को संभालने की आवश्यकता है। यदि चलने का तरीका है तो अपने रननेबल को अंत में फिर से पोस्ट करें। और आपको यह सुनिश्चित करने के लिए कि यह कभी भी छोड़ा नहीं गया है, आपको अंत में भागने योग्य के साथ रननेबल में अपना कोड लपेटना चाहिए और अंत में खंड में पुन: पोस्ट करना चाहिए। – Greg

+1

यह हल हो गया, धन्यवाद! :) –

+27

मुझे लगता है कि 'हैंडलर.postDelayed (यह, 1000); 'केवल अंत में अनुभाग (कोशिश ब्लॉक के अंत में नहीं) होना चाहिए, अन्यथा यह दो बार पोस्ट किया जाएगा। – Parmaia

2

handler.postDelayed(task, time); केवल यदि आप कोड नियमित अंतराल पर गति प्रदान करने के मैं एक Timer और एक Handler और एक Runnable के बजाय एक TimerTask सुझाव चाहते हैं, एक बार निष्पादित करेंगे।

TimerTasks एक बार, प्रत्येक एक्स सेकंड, या एक निश्चित अवधि के साथ चलाने के लिए सेट किया जा सकता है उदा। एक्स सेकंड - हालांकि यह आखिरी बार चलाने के लिए लिया गया था।

8

सबसे पहले आपको वैश्विक स्तर पर हैंडलर घोषित करना होगा दूसरा आपको फिर से ट्रिगर करने के लिए रननेबल में पोस्ट विलंब विधि का उपयोग करना होगा।

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Sync sync = new Sync(call,60*1000); 

    } 
    final private Runnable call = new Runnable() { 
     public void run() { 
     //This is where my sync code will be, but for testing purposes I only have a Log statement 
     Log.v("test","this will run every minute"); 
     handler.postDelayed(call,60*1000); 
     } 
    }; 
    public final Handler handler = new Handler(); 
    public class Sync { 


     Runnable task; 

     public Sync(Runnable task, long time) { 
      this.task = task; 
      handler.removeCallbacks(task); 
      handler.postDelayed(task, time); 
     } 
    } 


} 
1
 private void doSomethingRepeatedly() { 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 

        try{ 

        //Your code 

        } 
        catch (Exception e) { 
         // TODO: handle exception 
        } 

      } 
      }, 0, 10000); 
        } 
0

एक वैकल्पिक तरीका का उपयोग कर ScheduledExecutorService के scheduleAtFixedRate:

ScheduledThreadPoolExecutor से
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

public void beepEvery10Seconds() { 
    final Runnable beeper = new Runnable() { 
     public void run() { System.out.println("beep"); } 
    }; 
    final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 0, 10, SECONDS); 
} 
संबंधित मुद्दे