2012-07-11 16 views
70

एक विधि को चलाने के लिए कैसे करें मैं एक एंड्रॉइड 2.3.3 एप्लिकेशन विकसित कर रहा हूं और मुझे प्रत्येक एक्स सेकंड पर एक विधि चलाने की आवश्यकता है।प्रत्येक एक्स सेकंड

आईओएस में, मेरे पास NSTimer है, लेकिन एंड्रॉइड में मुझे नहीं पता कि इसका क्या उपयोग करना है।

किसी ने मुझे Handler की सिफारिश की है; एक और मुझे AlarmManager की सलाह देते हैं लेकिन मुझे नहीं पता कि कौन सी विधि NSTimer के साथ बेहतर फिट बैठती है।

timer2 = [ 
    NSTimer scheduledTimerWithTimeInterval:(1.0f/20.0f) 
    target:self 
    selector:@selector(loopTask) 
    userInfo:nil 
    repeats:YES 
]; 

timer1 = [ 
    NSTimer scheduledTimerWithTimeInterval:(1.0f/4.0f) 
    target:self 
    selector:@selector(isFree) 
    userInfo:nil 
    repeats:YES 
]; 

मैं की जरूरत है कुछ क्या NSTimer तरह काम करता है:

इस कोड मैं Android में लागू करना चाहते हैं।

आप मुझे क्या सलाह देते हैं?

+1

"सबसे अच्छा" परिभाषित करें। आप इसे किस तरह से सर्वश्रेष्ठ बनाना चाहते हैं? –

+0

मुझे नहीं पता कि कौन सी विधि एनएसटीमर के साथ बेहतर है। – VansFannel

+0

@VansFannel आप कितने अंतराल चाहते हैं? – FoamyGuy

उत्तर

110

यह वास्तव में कितनी देर तक अलग आप समारोह चलाने की आवश्यकता पर निर्भर करता है।

यदि यह => 10 मिनट → है तो मैं अलार्म प्रबंधक के साथ जाऊंगा।

// Some time when you want to run 
Date when = new Date(System.currentTimeMillis());  

try{ 
    Intent someIntent = new Intent(someContext,MyReceiver.class); // intent to be launched 

    // note this could be getActivity if you want to launch an activity 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
     context, 
     0, // id, optional 
     someIntent, // intent to launch 
     PendingIntent.FLAG_CANCEL_CURRENT); // PendintIntent flag 

    AlarmManager alarms = (AlarmManager) context.getSystemService(
     Context.ALARM_SERVICE); 

    alarms.setRepeating(AlarmManager.RTC_WAKEUP, 
     when.getTime(), 
     AlarmManager.INTERVAL_FIFTEEN_MINUTES, 
     pendingIntent); 

}catch(Exception e){ 
    e.printStackTrace(); 
} 

और फिर आप इन प्रसारणों को प्रसारण रिसीवर के माध्यम से प्राप्त करते हैं। ध्यान दें कि इसे आपके एप्लिकेशन मेनिफेस्ट में या context.registerReceiver(receiver,filter); विधि के माध्यम से पंजीकृत ईथर होने की आवश्यकता होगी ब्रॉडकास्ट रिसीवर पर अधिक जानकारी के लिए कृपया आधिकारिक डॉक्स देखें। Broadcast Receiver

public class MyReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     //do stuffs 
    } 
} 

अगर ऐसा है = < 10minutes → मैं एक हेन्डलर के साथ जाना होगा।

Handler handler = new Handler(); 
int delay = 1000; //milliseconds 

handler.postDelayed(new Runnable(){ 
    public void run(){ 
     //do something 
     handler.postDelayed(this, delay); 
    } 
}, delay); 
+0

समय देरी के आधार पर अलग-अलग सुझाव क्यों हैं? –

+3

क्षमता, अलार्ममैनेजर दस्तावेज़ों में यह कहता है कि इसका उपयोग किसी भी छोटे अंतराल दोहराव वाले कार्य के लिए नहीं किया जाना चाहिए। – Jug6ernaut

+5

@ [अलार्ममेनगर डॉक्स] में साइमन एंड्रेफोर्सबर्ग (http://developer.android.com/reference/android/app/AlarmManager.html) यह बताता है कि हैंडलर छोटी टिकों के लिए उपयोग करने के लिए पसंदीदा और अधिक प्रभावशाली विधि है: "नोट: अलार्म प्रबंधक उन मामलों के लिए है जहां आप अपना आवेदन कोड एक विशिष्ट समय पर चलाना चाहते हैं, भले ही आपका एप्लिकेशन वर्तमान में चल रहा न हो। सामान्य समय संचालन (टिक, टाइमआउट आदि) के लिए यह आसान और उपयोग करने में अधिक कुशल है हैंडलर। " – FoamyGuy

68

हर दूसरे के लिए टाइमर का प्रयोग करें ...

new Timer().scheduleAtFixedRate(new TimerTask() { 
       @Override 
       public void run() {} 
      }, 0, 1000);//put here time 1000 milliseconds=1 second 
+0

मैंने इस सवाल को अद्यतन किया है कि मैं क्या करने की कोशिश कर रहा हूं। – VansFannel

+0

टाइमर का उपयोग न करें (http://www.mopri.de/2010/timertask-bad-do-it-the-android-way-use-a-handler/), हैंडलर या अनुसूचित थ्रेडपूलएक्सएटर का उपयोग करें। – AppiDevo

18

हैंडलर प्रत्येक 15 सेकंड कॉल और जब गतिविधि दिखाई नहीं इसे रोकने के लिए इस कोड की कोशिश

Handler h = new Handler(); 
    int delay = 15*1000; //1 second=1000 milisecond, 15*1000=15seconds 
    Runnable runnable; 

    @Override 
    protected void onResume() { 
     //start handler as activity become visible 

     h.postDelayed(new Runnable() { 
      public void run() { 
       //do something 

       runnable=this; 

       h.postDelayed(runnable, delay); 
      } 
     }, delay); 

     super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     h.removeCallbacks(runnable); //stop handler when activity not visible 
     super.onPause(); 
    } 
+3

यही वह है जिसे मैं ढूंढ रहा था। उत्तम। – viper

6

आप RxJava से परिचित हैं, तो आप Observable.interval() है, जो बहुत साफ है उपयोग कर सकते हैं ।

Observable.interval(60, TimeUnits.SECONDS) 
      .flatMap(new Function<Long, ObservableSource<String>>() { 
       @Override 
       public ObservableSource<String> apply(@NonNull Long aLong) throws Exception { 
        return getDataObservable(); //Where you pull your data 
       } 
      }); 

इसका नकारात्मक पक्ष यह है कि आपको अपने डेटा को एक अलग तरीके से मतदान करने के लिए आर्किटेक्ट करना होगा।

  1. इसके बजाय एक कॉलबैक के माध्यम से अपने डेटा को नियंत्रित करने के लिए, आप डेटा की एक धारा है कि आप करने के लिए सदस्यता बनाने के लिए: हालांकि, वहाँ रिएक्टिव प्रोग्रामिंग तरह से करने के लिए लाभ का एक बहुत कुछ कर रहे हैं। यह "मतदान डेटा" तर्क और "आपके डेटा के साथ पॉप्युलेटिंग यूआई" तर्क की चिंता को अलग करता है ताकि आप अपना "डेटा स्रोत" कोड और अपना यूआई कोड मिश्रण न करें।
  2. RxAndroid के साथ, आप कोड की केवल 2 पंक्तियों में धागे को संभाल सकते हैं।

    Observable.interval(60, TimeUnits.SECONDS) 
         .flatMap(...) // polling data code 
         .subscribeOn(Schedulers.newThread()) // poll data on a background thread 
         .observeOn(AndroidSchedulers.mainThread()) // populate UI on main thread 
         .subscribe(...); // your UI code 
    

कृपया बाहर RxJava की जाँच करें। इसमें एक उच्च सीखने की वक्र है लेकिन यह एंड्रॉइड में एसिंक्रोनस कॉल को इतना आसान और क्लीनर संभालने में सक्षम करेगी।

0

यहाँ मैं (onCreate में एक धागा) एक गतिविधि repeatly इस्तेमाल किया, टाइमर कुछ मामलों थ्रेड में सब कुछ समाधान

 Thread t = new Thread() { 
     @Override 
     public void run() { 
      while (!isInterrupted()) { 
       try { 
        Thread.sleep(10000); //1000ms = 1 sec 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 

          SharedPreferences mPrefs = getSharedPreferences("sam", MODE_PRIVATE); 
          Gson gson = new Gson(); 
          String json = mPrefs.getString("chat_list", ""); 
          GelenMesajlar model = gson.fromJson(json, GelenMesajlar.class); 
          String sam = ""; 

          ChatAdapter adapter = new ChatAdapter(Chat.this, model.getData()); 
          listview.setAdapter(adapter); 
          // listview.setStackFromBottom(true); 
          // Util.showMessage(Chat.this,"Merhabalar"); 
         } 
        }); 

       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 

    t.start(); 

मामले में यह आवश्यक यह

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    Thread.interrupted(); 
    //t.interrupted(); 
} 
द्वारा stoped किया जा सकता है की अनुमति नहीं है
+0

कृपया स्थिति का वर्णन करें जब मेरा उत्तर काम नहीं करेगा –

+0

हैलो उमर। मुझे पूरे सर्कल की आवश्यकता थी कि ऐप ज़िंदा है, हैंडलर जीवित है जबकि गतिविधि जिंदा है, लेकिन मुझे सर्कल की जरूरत है जबकि मैं अन्य गतिविधियों पर भी जा सकता था। तो थ्रेड इस तरह से समाधान है कि यह भी इसके संघर्ष है। – Sam

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