Android – 使用postDelayed()调用定期运行一个方法

我有一个Android应用程序的情况下,我想开始一个networking活动(发送一些数据),应该每秒运行。 我做到这一点如下:

onCreate()我有代码:

 tv = new TextView(this); tv.postDelayed(sendData, 1000); 

sendData()函数:

  Handler handler = new Handler(); private Runnable sendData=new Runnable(){ public void run(){ try { //prepare and send the data here.. handler.removeCallbacks(sendData); handler.postDelayed(sendData, 1000); } catch (Exception e) { e.printStackTrace(); } } }; 

问题来了这样的:当用户按下后退button和应用程序出来(用户界面消失) sendData()函数仍然得到执行,这是我想要的。 现在,当用户重新启动应用程序时,我的onCreate()被再次调用,我得到了sendData()调用两次sendData() 。 它继续这样下去。 每次用户出来并重新启动,每秒钟会发生一次sendData()

我究竟做错了什么? 是我的new Handler()创build问题吗? 处理这个问题的最好方法是什么? 我想要一个sendData()每秒调用,直到用户退出应用程序(表单应用程序pipe理器)。

你为什么不创build服务,并把逻辑放在onCreate() 。 在这种情况下,即使你按下后退button服务也会继续执行。 一旦你进入应用程序,它不会再次调用onCreate() 。 相反,它会调用onStart()

 final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { //Do something after 100ms Toast.makeText(c, "check", Toast.LENGTH_SHORT).show(); handler.postDelayed(this, 2000); } }, 1500); 

也许涉及活动的生命周期方法来实现这一点:

 Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler.post(sendData); } @Override protected void onDestroy() { super.onDestroy(); handler.removeCallbacks(sendData); } private final Runnable sendData = new Runnable(){ public void run(){ try { //prepare and send the data here.. handler.postDelayed(this, 1000); } catch (Exception e) { e.printStackTrace(); } } }; 

在这种方法中,如果你按下你的活动的后退键或者调用finish(); ,它也会停止postDelayed的调用。

请在下面的代码中检查下面它的工作方式,当你处于同一个活动时,你的处理程序将在每1秒之后运行

  HandlerThread handlerThread = new HandlerThread("HandlerThread"); handlerThread.start(); handler = new Handler(handlerThread.getLooper()); runnable = new Runnable() { @Override public void run() { handler.postDelayed(this, 1000); } }; handler.postDelayed(runnable, 1000); 

您应该在Manifest.xml中设置andrid:allowRetainTaskState =“true”来启动Activity。 如果这个活动不是启动活动。 您应该在此活动中设置android:launchMode =“singleTask”

我想你可以尝试不同的活动标志,因为它听起来像多个实例。

“singleTop”“singleTask”“singleInstance”

是我会尝试的,他们可以在清单内定义。

http://developer.android.com/guide/topics/manifest/activity-element.html

我们有Java 8,我们不需要为处理程序编写太多的代码。

只要写:

 final Handler handler = new Handler(); handler.postDelayed (() -> { //your code here }, TIME_DELAY); 
 Handler h = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what==0){ // do stuff h.removeMessages(0); // clear the handler for those messages with what = 0 h.sendEmptyMessageDelayed(0, 2000); } } }; h.sendEmptyMessage(0);