我希望每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();
}
答案 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可以写入然后复制粘贴。