Android 如何每X秒运行一个方法

Android 如何每X秒运行一个方法,android,timer,nstimer,Android,Timer,Nstimer,我正在开发一个Android 2.3.3应用程序,我需要每隔X秒运行一个方法 在iOS中,我有,但在Android中我不知道该用什么 有人推荐我;另一个建议我,但我不知道哪种方法更适合 这是我想在Android中实现的代码: timer2 = [ NSTimer scheduledTimerWithTimeInterval:(1.0f/20.0f) target:self selector:@selector(loopTask) userInfo:nil

我正在开发一个Android 2.3.3应用程序,我需要每隔X秒运行一个方法

在iOS中,我有,但在Android中我不知道该用什么


有人推荐我;另一个建议我,但我不知道哪种方法更适合

这是我想在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
];
我需要一种工作方式


你给我推荐什么?

每秒钟使用定时器

new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        //your method
    }
}, 0, 1000);//put here time 1000 milliseconds=1 second

您将使用的解决方案实际上取决于每次执行函数之间需要等待多长时间

如果您等待的时间超过10分钟,我建议您使用
AlarmManager

//您想运行的时候
日期时间=新日期(System.currentTimeMillis());
试一试{
Intent someIntent=新的Intent(someContext,MyReceiver.class);//要启动的Intent
//注意:如果要启动活动,可以使用getActivity
PendingIntent PendingIntent=PendingIntent.getBroadcast(
上下文
0,//id(可选)
someIntent,//打算启动
PendingEvent.FLAG_取消_当前//PendingEvent标志
);
AlarmManager报警=(AlarmManager)context.getSystemService(
Context.ALARM\u服务
);
报警。设置重复(
AlarmManager.RTC_唤醒,
当.getTime()时,
AlarmManager.INTERVAL_十五分钟,
悬垂物
);
}捕获(例外e){
e、 printStackTrace();
}
一旦您广播了上述
意图
,您就可以通过实现
广播接收器
来接收您的
意图
。请注意,这将需要在应用程序清单中或通过
context.registerReceiver(接收方,intentFilter)注册方法

公共类MyReceiver扩展了BroadcastReceiver{
@凌驾
公共void onReceive(上下文、意图)
{
System.out.println(“MyReceiver:here!”//在这里工作
}
}
如果您等待的时间少于10分钟,那么我建议您使用
处理程序

final Handler=new Handler();
最终整数延迟=1000;//1000毫秒==1秒
handler.postDelayed(新的Runnable(){
公开募捐{
System.out.println(“myHandler:here!”;//在这里工作
handler.postDelayed(这个,delay);
}
},延误);

您可以尝试以下代码,通过onResume()每隔15秒调用处理程序,并在活动不可见时通过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
                }
            });

请查看RxJava。它有很高的学习曲线,但它将使在Android中处理异步调用变得更加容易和干净。

这里我在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()
}

使用rxjava&rxandroid

可能对您的问题有帮助,我这样做,效果很好(代码是用Kotlin编写的):

然后从函数内部重新设置runnable

runnable = Runnable {

        // Your code goes here

        handler.postDelayed(runnable, repeatPeriod)

    }

    handler.postDelayed(runnable, repeatPeriod)

}


请注意,如果您没有两倍于处理程序的postDelay,那么循环将不会是初始的

为什么不同的建议取决于时间延迟?效率,在AlarmManager文档中,它声明不应将其用于任何小间隔重复性任务。@SimonAndréForsberg在it文档中指出,处理程序是用于短节拍的首选且更有效的方法:注意:Alarm Manager适用于希望在特定时间运行应用程序代码的情况,即使应用程序当前未运行。对于正常的计时操作(滴答声、超时等),使用Handler更容易、更高效。“但是,我需要在启动AlarmManager的同一活动中运行一个方法。我该怎么做呢?@ahmadalibaloch从runnable中可以执行
h.removeCallbacks(此);
,否则您需要维护对runnable的引用才能将其删除。如果需要第二个,则此处发布的方法可能不是您的最佳路线。请定义“最佳路线”“。您希望它以什么方式最好?我不知道哪种方法更适合NSTimer。@VansFannel您希望间隔多长时间?我已更新了问题,详细说明了我正在尝试做的事情。此问题:,与此问题类似,答案很好。我已经更新了问题的细节,说明了我要做什么。不要使用Timer()、使用Handler或ScheduledThreadPoolExecutor。@AppiDevo链接似乎已经死了,试试这就是我要找的。完美。这是完美的答案!完全正确用于检查MainActivity在TableLayout中当前选定的选项卡是否与此片段匹配,如果未停止工作,则当任何TableLayout选定的选项卡位于此选定选项卡的任意一侧时,onPause()将失败。这就是我想要的:)1个问题,我可以从另一个活动调用此方法吗。或者如果我离开这个活动,这个物体会被摧毁吗?如果我创建了一个静态处理程序并可运行呢。有可能吗?这就是答案!谢谢请描述一下我的回答不起作用的情况。我需要一个圆圈,在应用程序处于活动状态时,处理程序使重复处于活动状态,但在我能够访问其他活动时,我也需要一个圆圈。所以线程是这样的解决方案,当然它也有它的挣扎。不要只发布代码来回答。请给出你的答案并加上一些解释。
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()
}
private lateinit var runnable: Runnable

private var handler = Handler(Looper.getMainLooper())

private val repeatPeriod: Long = 10000
runnable = Runnable {

        // Your code goes here

        handler.postDelayed(runnable, repeatPeriod)

    }

    handler.postDelayed(runnable, repeatPeriod)

}