【问题标题】:Android - running a method periodically using postDelayed() callAndroid - 使用 postDelayed() 调用定期运行方法
【发布时间】:2012-06-01 06:02:13
【问题描述】:

我在一个 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()

【问题讨论】:

    标签: android postdelayed


    【解决方案1】:
    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);
    

    【讨论】:

      【解决方案2】:

      也许涉及到实现这一点的activity的生命周期方法:

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

      【讨论】:

      • 谢谢你的意见。事实上,我希望 postDelayed 任务即使在用户按下后也能继续。尝试了这段代码,它按预期工作:当用户按下后退按钮时,postDelayed 调用停止。
      【解决方案3】:

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

      【讨论】:

      • 谢谢。我创建了一个服务活动,它运行良好。即使按下后退按钮,我也希望服务任务继续运行。
      【解决方案4】:

      你可以像这样简化代码。

      在 Java 中:

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

      在 Kotlin 中:

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

      【讨论】:

        【解决方案5】:

        请在下面的代码中检查它在我这边的工作情况,当您在同一活动中时,您的处理程序将在每 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);
        

        【讨论】:

          【解决方案6】:
          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);  
          

          【讨论】:

            【解决方案7】:

            我认为您可以尝试不同的活动标志,因为这听起来像是多个实例。

            “单顶” “单任务” “单例”

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

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

            【讨论】:

              【解决方案8】:

              您应该在 Manifest.xml 中将 andrid:allowRetainTaskState="true" 设置为 Launch Activity。如果此 Activity 不是 Launch Activity。您应该在此活动中设置 android:launchMode="singleTask"

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-06
                • 2011-10-07
                • 1970-01-01
                • 2015-05-21
                • 1970-01-01
                • 2021-12-28
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多