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);