Android - 使用postDelayed()调用定期运行方法

zol*_*lio 45 android postdelayed

我有一个Android应用程序的情况,我想开始一个应该每秒运行的网络活动(发送一些数据).我实现如下:

onCreate()我有代码:

tv = new TextView(this);
tv.postDelayed(sendData, 1000);
Run Code Online (Sandbox Code Playgroud)

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();
        }   
    }
};
Run Code Online (Sandbox Code Playgroud)

问题是这样的:当用户按下后退按钮并且应用程序出现(UI消失)时,该sendData()功能仍然会被执行,这就是我想要的.现在,当用户重新启动应用程序时,我onCreate()再次被sendData()调用,并且每秒调用两次.它继续这样下去.每当用户出来并重新开始时,sendData()每秒钟就会发生一次.

我究竟做错了什么?这是我的new Handler()创造问题吗?处理这个问题的最佳方法是什么?sendData()在用户退出应用程序(表单应用程序管理器)之前,我希望每秒调用一次.

Saa*_*sad 100

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);
Run Code Online (Sandbox Code Playgroud)


waq*_*lam 30

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

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();
        }   
    }
};
Run Code Online (Sandbox Code Playgroud)

在这种方法中,如果您按活动或呼叫的后退键finish();,它也将停止postDelayed呼叫.


Vip*_*hah 27

你为什么不创建服务并把逻辑放进去onCreate().在这种情况下,即使按下后退按钮服务也将继续执行.一旦你进入申请,它就不会再打电话 onCreate()了.相反它会打电话onStart()


Var*_*ran 15

您可以像这样简化代码.

写吧:

new Handler().postDelayed (() -> {
    //your code here
}, 1000);
Run Code Online (Sandbox Code Playgroud)

在Kotlin:

Handler().postDelayed({
   //your code here
}, 1000)
Run Code Online (Sandbox Code Playgroud)