Android 连接到笔记本电脑时的不同行为
我编写了一个应用程序,记录来自智能手机传感器的数据。 我有一个线程,每小时将这些数据写入一个文件。 当连接到我的笔记本电脑时,该应用程序运行良好。每小时创建一个新文件 但当智能手机与笔记本电脑断开连接时,它不会这样做。它没有崩溃,但应用程序运行了一整夜,只创建了一个文件 我的代码使用Thread.sleep,这是一个问题吗 我正在用安卓4.4.4测试Nexus5Android 连接到笔记本电脑时的不同行为,android,battery,Android,Battery,我编写了一个应用程序,记录来自智能手机传感器的数据。 我有一个线程,每小时将这些数据写入一个文件。 当连接到我的笔记本电脑时,该应用程序运行良好。每小时创建一个新文件 但当智能手机与笔记本电脑断开连接时,它不会这样做。它没有崩溃,但应用程序运行了一整夜,只创建了一个文件 我的代码使用Thread.sleep,这是一个问题吗 我正在用安卓4.4.4测试Nexus5 @Override public void run() { String filename =
@Override
public void run()
{
String filename = "";
String directory = "";
Date now = new Date();
while (!stopped)
{
Log.i(TAG, "Start the one hour sleep");
sleepForOneHour(now);
now = new Date();
directory = directoryDateFormat.format(now);
filename = filenameDateFormat.format(now);
Log.i(TAG, "Write data to SD-card");
setFileWriteDirectory(directory);
writeDataToSdCard(filename);
}
super.run();
}
private void sleepForOneHour(Date filesWritten)
{
Date now = new Date();
long nowMillies = now.getTime();
long filesWrittenMillies = filesWritten.getTime();
long passedMillies = (nowMillies - filesWrittenMillies);
long milliesPerHour = (60 * 60 * 1000);
long waitMillies = (milliesPerHour - passedMillies);
try
{
sleep(waitMillies);
} catch (InterruptedException e)
{
Log.d(TAG, "Interrupted sleep in filehandler thread");
}
}
更新
我试着用Android.Timer代替Thread.sleep,但结果是一样的。以下是一些有根据的猜测和建议 智能手机在未使用功能时具有一些非常严格的断电功能。其中一些功能将关闭不重要的中断 检查您的睡眠呼叫使用的时钟。一些计时器的基础是时钟滴答声,当处于低功率状态时,时钟滴答声也会减慢,有时甚至停止 检查是否有一些特殊的线程调用,您需要保持线程运行,包括在手机处于低功耗状态时从睡眠中醒来
关于当手机未连接到笔记本电脑时,某些线程似乎不再执行。计时器和睡眠线程显然是其中之一 对我来说,解决办法是使用唤醒锁。这确实会严重影响功耗 在我的主要活动中,我获得了这样一个唤醒锁
private static WakeLock lockStatic;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PowerManager mgr = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
lockStatic.setReferenceCounted(true);
lockStatic.acquire();
...
}
我在onDestroy中释放wakelock。这是不推荐的,因为这会导致电池消耗更快,但我使用手机作为一个专用的记录设备,所以我不太关心电池寿命
@SuppressLint("Wakelock")
@Override
protected void onDestroy()
{
...
lockStatic.release();
super.onDestroy();
}