Как запустить метод каждые X секунд

Я разрабатываю приложение Android 2.3.3, и мне нужно запустить метод каждые X секунд .

В iOS у меня есть NSTimer , но в Android я не знаю, что использовать.

Кто-то порекомендовал мне Handler ; другой рекомендую мне AlarmManager, но я не знаю, какой метод лучше подходит для NSTimer .

Это код, который я хочу реализовать в Android:

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 .

Что вы мне порекомендовали?

Это действительно зависит от того, сколько времени вам нужно, чтобы запустить функцию.

Если это => 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); метод. Для получения дополнительной информации о вещательных приемниках обратитесь к официальным документам. Широковещательный приемник .

 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); 

Используйте таймер на каждую секунду …

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

попробуйте этот код обработать вызовом каждые 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( runnable = new Runnable() { public void run() { //do something h.postDelayed(runnable, delay); } }, delay); super.onResume(); } @Override protected void onPause() { h.removeCallbacks(runnable); //stop handler when activity not visible super.onPause(); } 

Если вы знакомы с RxJava, вы можете использовать Observable.interval (), что довольно аккуратно.

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

Недостатком этого является то, что вам нужно архивировать опрос ваших данных по-другому. Тем не менее, существует много преимуществ для метода реактивного программирования:

  1. Вместо того, чтобы управлять вашими данными через обратный вызов, вы создаете stream данных, на которые вы подписываетесь. Это отделяет внимание логики «опроса данных» и логики «заполнения пользовательского интерфейса с вашими данными», чтобы вы не смешивали код «источника данных» и ваш код пользовательского интерфейса.
  2. С RxAndroid вы можете обрабатывать streamи всего в 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. Он имеет высокую кривую обучения, но он сделает обработку асинхронных вызовов в Android намного проще и чище.

Здесь я использовал stream в onCreate () Activity снова, таймер не позволяет все в некоторых случаях Thread – это решение

  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(); } 
  new CountDownTimer(120000, 1000) { public void onTick(long millisUntilFinished) { txtcounter.setText(" " + millisUntilFinished / 1000); } public void onFinish() { txtcounter.setText(" TimeOut "); Main2Activity.ShowPayment = false; EventBus.getDefault().post("go-main"); } }.start(); 
  • Самый точный таймер в .NET?
  • Использование System.Windows.Forms.Timer.Start () / Stop () по сравнению с Enabled = true / false
  • C ++, получение миллисекундного времени на Linux - clock (), похоже, не работает должным образом
  • Android: доступ к элементу пользовательского интерфейса из streamа таймера
  • Почему System.Timers.Timer выживает GC, но не System.Threading.Timer?
  • .NET, событие каждую минуту (в минуту). Является ли таймер лучшим вариантом?
  • Разница между std :: system_clock и std :: stable_clock?
  • Таймер Java
  • System.Timers.Timer Истекшее событие, выполняющееся после вызова timer.Stop ()
  • java.util.Timer: устарел ли он?
  • Завершить работу по истечении периода времени
  • Interesting Posts
    Давайте будем гением компьютера.