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
}
}
= <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
}
});
この欠点は、データのポーリングを別の方法で設計する必要があることです。ただし、リアクティブプログラミングの方法には多くの利点があります。
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();
}
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()
}