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

46

我在一个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(),直到用户退出应用程序(从应用程序管理器中退出)。

8个回答

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

31

也许可以利用活动的生命周期方法来实现这一点:

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的调用。

在这种方法中,如果您在活动中按下“返回键”或调用finish();,它也将停止postDelayed的调用。


谢谢你的点赞。实际上,我希望在用户按下返回按钮时postDelayed任务能够继续执行。尝试了这段代码,它按照预期工作:当用户按下返回按钮时,postDelayed调用不会停止。 - zolio

28

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


谢谢。我创建了一个服务活动,它运行良好。我希望即使按下返回按钮,服务任务也能继续运行。 - zolio

16

你可以这样简化代码。

在Java中:

new Handler().postDelayed (() -> {
    //your code here
}, 1000);

在 Kotlin 中:

Handler().postDelayed({
   //your code here
}, 1000)

2
请查看下面的代码,在我的这一侧代码可以正常运行。在你处,当你处于相同的活动时,你的处理程序将每秒运行一次。
 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);

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

0

0

在 Manifest.xml 中启动 Activity 时,您应该设置 android:allowRetainTaskState="true"。如果此 Activity 不是启动 Activity,则应在此 Activity 上设置android:launchMode="singleTask"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接