提问者:小点点

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


我在Android应用程序中遇到了一种情况,我想启动一个应该每秒运行一次的网络活动(发送一些数据)。我实现这一点如下:

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

问题是这样的:当用户按下返回按钮,应用程序出来(UI消失)时,sendData()函数仍然会被执行,这就是我想要的。现在,当用户重新启动应用程序时,我的onCreate()再次被调用,我的sendData()每秒被调用两次。它继续这样下去。每次用户出来并再次启动,每秒都会发生一次sendData()

我做错了什么?是我的new Handler()创建问题吗?处理此问题的最佳方法是什么?我希望每秒调用一次sendData(),直到用户退出应用程序(表单应用程序管理器)。


共3个答案

匿名用户

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

在这种方法中,如果您在活动上按返回键或调用完成();,它也将停止postDelayed调用。

匿名用户

为什么不创建服务并将逻辑放在onCreate()中。在这种情况下,即使您按返回按钮,服务也会继续执行。一旦您进入应用程序,它将不会再次调用onCreate()。相反,它将调用onStart()