Thread.sleep()vs handler.postDelay()每30秒执行一次网络调用

时间:2017-09-24 07:01:46

标签: android multithreading handler

我希望每30秒执行一次网络呼叫,将一些指标推送到服务器。目前我正在使用thread.sleep()。我发现一些文章说thread.sleep()有一些缺点。我需要知道我做得对吗?或用Handler替换线程会改善我的代码吗?

public static void startSending(final Context con) {
    if (running) return;
    running = true;
    threadToSendUXMetrics = new Thread(new Runnable() {

        @Override
        public void run() {
            do {
                try {
                    Thread.sleep(AugmedixConstants.glassLogsPushInterval);
                } catch (InterruptedException e) {
                    mLogger.error(interrupt_exception + e.getMessage());
                }
                // to do to send each time, should have some sleep code
                if (AugmedixConstants.WEBAPP_URL.equals(AugmedixConstants.EMPTY_STRING)||!StatsNetworkChecker.checkIsConnected(con)) {
                    Utility.populateNetworkStat();
                    mLogger.error(may_be_provider_not_login_yet);
                } else
                    sendUXMetrics();

            } while (running);

            if (!uxMetricsQueue.isEmpty()) sendUXMetrics();

        }
    });
    threadToSendUXMetrics.start();
}

3 个答案:

答案 0 :(得分:1)

如果您只在网络中使用一个线程,那么使用thread.sleep()就可以了。如果同步中有多个线程,则thread.sleep()命令将阻止当前正在运行的所有其他线程。 根据您提供的详细信息,只有一个线程不会阻止同步运行的任何其他活动线程,因此使用thread.sleep()不应该成为问题。

答案 1 :(得分:1)

如果您在UI线程中工作,请使用Handler.postDelayed来安排任务;如果您在后台线程中工作,则使用Thread.sleep

显然您正在使用网络发送一些数据,您必须在后台线程中执行此操作,因此建议使用Thread.sleep

答案 2 :(得分:0)

简单就是:

  • Thread.sleep(millisSeconds):使用此方法,您只能调用后台任务,例如在AsyncTask::doInBackground()中,您可以在此之后调用延迟操作。 推荐在背景线中调用此方法
  • Handler().postDelayed({METHOD}, millisSeconds):对于此实例,METHOD将在millisSeconds宣告后触发。

但是,为了轻松处理Handler()的生命周期,您需要使用Handler()实例声明Runnable实例。例如,当您Activity暂停或者您不需要再次调用该方法时,您可以从Handler()中删除回调。以下是示例:

public class MainActivity extends Activity {

   private Handler mHandler = Handler();

   public void onStart(...) {
      super.onStart(...)
      this.mHandler.postDelayed(this.foo, 1000)
   }

   public void onPaused(...) {
      this.mHandler.removeCallback(this.foo)
      super.onPaused(...)
   }

   private Runnable foo = new Runnable() {
      @Override
      public void run() {
         // your code will call after 1 second when activity start
         // end remove callback when activity paused

         // continue call...
         mHandler.postDelayed(foo, 1000)
      }
   }

}

以上代码仅供参考,我手工输入,因为没有IDE可以写入然后复制粘贴。