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);
방법을 통해 등록되어야 합니다. Broadcast Receiver에 대한 자세한 내용은 공식 문서를 참조하십시오. 방송 수신기 .
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);
답변
1 초마다 타이머 사용 …
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
//your method
}
}, 0, 1000);//put here time 1000 milliseconds=1 second
답변
이 코드를 사용하여 onResume ()을 통해 15 초마다 핸들러를 호출하고 onPause ()를 통해 활동이 표시되지 않을 때 중지 할 수 있습니다.
Handler handler = new Handler();
Runnable runnable;
int delay = 15*1000; //Delay for 15 seconds. One second = 1000 milliseconds.
@Override
protected void onResume() {
//start handler as activity become visible
handler.postDelayed( runnable = new Runnable() {
public void run() {
//do something
handler.postDelayed(runnable, delay);
}
}, delay);
super.onResume();
}
// If onPause() is not included the threads will double up when you
// reload the activity
@Override
protected void onPause() {
handler.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에서 비동기 호출을 훨씬 쉽고 깔끔하게 처리 할 수 있습니다.
답변
Kotlin을 사용하여 이제이를위한 일반 함수를 만들 수 있습니다!
object RepeatHelper {
fun repeatDelayed(delay: Long, todo: () -> Unit) {
val handler = Handler()
handler.postDelayed(object : Runnable {
override fun run() {
todo()
handler.postDelayed(this, delay)
}
}, delay)
}
}
그리고 사용하려면 다음을 수행하십시오.
val delay = 1000L
RepeatHelper.repeatDelayed(delay) {
myRepeatedFunction()
}
답변
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();
}