Как запустить метод каждые X секунд
Я разрабатываю приложение Android 2.3.3, и мне нужно запустить метод каждые X секунд .
В iOS у меня есть NSTimer , но в Android я не знаю, что использовать.
Кто-то порекомендовал мне Handler ; другой рекомендую мне AlarmManager, но я не знаю, какой метод лучше подходит для NSTimer .
- Как создать таймер пакетного файла для выполнения / вызова другой партии в течение дня
- Вычислить время выполнения метода
- Почему таймеры .NET ограничены разрешением 15 мс?
- System.Threading.Timer в C #, похоже, не работает. Он работает очень быстро каждые 3 секунды
- System.Timers.Timer vs System.Threading.Timer
Это код, который я хочу реализовать в 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 .
Что вы мне порекомендовали?
- вызов метода через каждые 60 секунд в iPhone
- Как отключить stream
- анимация JPanel (слайд) с таймером
- java: запустить функцию через определенное количество секунд
- Windows.Forms.Timer OR System.Threading.Timer
- Лучший таймер для использования в службе Windows
- Обновление пользовательского интерфейса в C # с использованием таймера
- System.Timers.Timer / Threading.Timer vs Thread with WhileLoop + Thread.Sleep для периодических задач
Это действительно зависит от того, сколько времени вам нужно, чтобы запустить функцию.
Если это => 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 } });
Недостатком этого является то, что вам нужно архивировать опрос ваших данных по-другому. Тем не менее, существует много преимуществ для метода реактивного программирования:
- Вместо того, чтобы управлять вашими данными через обратный вызов, вы создаете stream данных, на которые вы подписываетесь. Это отделяет внимание логики «опроса данных» и логики «заполнения пользовательского интерфейса с вашими данными», чтобы вы не смешивали код «источника данных» и ваш код пользовательского интерфейса.
-
С 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();