我正在开发一个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 。
你有什么建议吗?
这真的取决于你需要多长时间分开运行的功能。
如果是=>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
}
}
如果是= <10分钟→我会去与一个处理程序。
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() {
//your method
}
}, 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<Long, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(@NonNull Long aLong) throws Exception {
return getDataObservable(); //Where you pull your data
}
});
这种方法的缺点是,你必须建筑师查询您的数据以不同的方式。 不过,也有不少的反应式编程方法的好处:
- 相反,通过回调控制你的数据,你创建你订阅的数据流。 这种分离“调查数据”的逻辑和逻辑“与您的数据填充UI”,让你不混合的“数据源”代码和UI代码的关注。
随着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();
}