2017-09-24 298 views
2

我希望每30秒執行一次網絡呼叫以將一些指標推送到服務器。目前我正在使用thread.sleep()。我發現一些文章說thread.sleep()有一些缺點。我需要知道我做對了嗎?或用Handler替換線程會改善我的代碼?Thread.sleep()vs handler.postDelay()每30秒執行一次網絡呼叫

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

你想,如果應用程序正在運行發送metrices或想繼續發送,即使應用程序是不是在前臺 –

+0

@AbdulWaheed,我的應用程序是系統啓動的應用程序,它仍然對前景。所以,當應用程序運行時發送也適用於我的情況。 –

+0

爲什麼你聚焦線程呢?一個線程可以被操作系統隨時殺死。你爲什麼不嘗試Android服務。 –

回答

1

如果你只使用一個網絡中的線程,那麼thread.sleep()的使用是好的。如果同時存在多個線程,則thread.sleep()命令將阻止當前正在運行的所有其他線程。 根據您提供的詳細信息,只有一個線程不會阻塞任何其他正在同步運行的活動線程,因此使用thread.sleep()應該不成問題。

1

如果您在UI線程中工作,使用Handler.postDelayed可以安排任務,如果您在後臺線程中工作,則使用Thread.sleep

顯然你使用網絡發送一些數據,你必須在後臺線程中執行,因此建議使用Thread.sleep

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來寫,然後複製粘貼。