连接到笔记本电脑时的行为不同

时间:2014-09-25 10:31:11

标签: android battery

我写了一个应用程序来记录来自智能手机传感器的数据。 我有一个线程,每小时将这些数据写入一个文件。 连接到我的笔记本电脑,该应用程序工作正常。每小时创建一个新文件。

但是,当智能手机与笔记本电脑断开连接时,它不会这样做。它没有崩溃,但应用程序运行整晚,只创建了一个文件...

我的代码使用Thread.sleep()这是一个问题吗?

我正在测试这是一款带有android 4.4.4的Nexus 5

    @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,但这给出了相同的结果。

2 个答案:

答案 0 :(得分:0)

以下是一些有根据的猜测和建议。

  1. 智能手机具有一些非常严格的省电功能。这些功能中的一些将关闭那些不重要的中断"。

  2. 检查您的睡眠呼叫使用的时钟。一些定时器的基础是时钟滴答,当处于低功耗状态时,时钟滴答也会减慢并且有时会停止。

  3. 检查手机处于低功耗状态时是否需要进行一些特殊的线程调用以保持线程正常运行(包括从睡眠状态唤醒)。

  4. 此致

答案 1 :(得分:0)

当手机未连接到笔记本电脑时,似乎某些线程不再执行。定时器和睡眠线程显然是其中之一。

对我有用的解决方案是使用WAKE_LOCK。这确实会严重影响功耗......

在我的主要活动的onCreate中,我获得了这样的WAKE_LOCK。

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中释放了唤醒锁。不建议这样做,因为这会导致电池耗电更快,但我将手机用作专用的记录设备,所以我对电池寿命并不在意。

@SuppressLint("Wakelock")
@Override
protected void onDestroy()
{
    ...
    lockStatic.release();
    super.onDestroy();
}