2014-09-25 95 views
0

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

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

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

我测试这一个一个的Nexus 5采用Android 4.4.4

@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"); 
     } 
    } 

UPDATE

我尝试使用Android.Timer代替Thread.sleep,但是这给了相同的结果。

回答

0

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

对我而言,解决方案是使用WAKE_LOCK。这会严重影响功耗......

在我的主Activity的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中的wakelock。这是不推荐的,因为这会导致电池更快地耗尽,但我使用手机作为专用记录设备,所以我不在乎电池的寿命。

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

这里有一些受过教育的猜测和建议。

  1. 智能手机有一些非常严格的断电而未使用的功能。这些功能中的一部分将关闭不“关键”的中断。

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

  3. 检查在手机处于低功耗状态时是否需要保持线程运行(包括从睡眠中唤醒)的某种特殊线程调用。

问候

相关问题