Как запустить метод каждые X секунд
Я разрабатываю приложение для Android 2.3.3 и мне нужно запустить метод каждый X секунд.
в iOS, у меня есть NSTimer, но в Android я не знаю, что использовать.
кто-то порекомендовал мне проводник; другой рекомендую мне 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.
что вы мне порекомендуете?
6 ответов:
Это действительно зависит от того, как долго вы должны запустить функцию.
если это = > 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(); }и затем вы получаете эти трансляции через широковещательный приемник. Обратите внимание, что это должно быть зарегистрировано ether в манифесте приложения или через
context.registerReceiver(receiver,filter);метод для получения дополнительной информации о широковещательных приемниках см. официальные документы. Радиовещательный Приемник.public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //do stuffs } }если это =
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.интервал (), что довольно аккуратно.
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 } });недостатком этого является то, что вы должны архитектор опроса данных по-другому. Тем не менее, есть много преимуществ для реактивного способа программирования:
- вместо управления данными с помощью обратного вызова, вы создаете поток данных, на которые вы подписываетесь. Это разделяет заботу о логике" опроса данных " и " заполнении пользовательского интерфейса вашими данными" логика, чтобы вы не смешивали код "источника данных" и код пользовательского интерфейса.
С помощью 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. Он имеет высокую кривую обучения, но это сделает обработку асинхронных вызовов в Android намного проще и чище.
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();
здесь я использовал поток в onCreate () активность повторяется, таймер не позволяет все в некоторых случаях поток является решением
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(); }
Comments