2012-07-02 32 views
0

我有一个小型数据收集应用程序,它有一个按钮来启动和停止服务。查找我的应用程序停止的原因,Android

该服务反过来启动一个新的线程。每收到一次关于它的广播,它就收集有关电压变化的数据。

数据暂时存储在ArrayList中,并且每10秒钟将存储在arrayList中的所有数据转储到数据库中。

应用程序运行良好10-20分钟,但20分钟后应用程序自动停止。有时服务仍在运行,有时服务也会中止。

你们可以告诉我这里可能是什么问题。 我认为可能涉及这个问题的事情是:

1.>我每10秒打开和关闭数据库。我应该改变设计来关闭数据库,只有当整个应用程序完成。

2.>我也采取了一个唤醒锁,但没有任何区别。我是否应该服用wakelock来服务我的服务?

3>最后一点我怎么来认识一下,因为其中的我的应用程序停止错误(我无法连接到USB知道怎么把我想的电池是在排出模式)

更新

的logcat的误差如下:

E/AndroidRuntime(9770): FATAL EXCEPTION: Timer-0 
E/AndroidRuntime(9770): java.util.ConcurrentModificationException 
E/AndroidRuntime(9770): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569) 
E/AndroidRuntime(9770): at com.amazon.hsyal.services.LoggerThread$2.run(LoggerThread.java:78) 
E/AndroidRuntime(9770): at java.util.Timer$TimerImpl.run(Timer.java:284) 
W/ActivityManager( 236): Force finishing activity com.amazon.hsyal/.ui.VoltageSODLoggerActivity 
I/ActivityManager( 236): No longer want com.amazon.dcp:OTAService (pid 12299): hidden #16 
I/WindowManager( 236): WIN DEATH: Window{417dcd20 com.amazon.hsyal/com.amazon.hsyal.ui.VoltageSODLoggerActivity paused=true} 
I/UsageStats( 236): No package stats for pkg:com.amazon.kindle.otter 
I/ActivityManager( 236): Process com.amazon.hsyal (pid 9770) has died. 
W/ActivityManager( 236): Scheduling restart of crashed service com.amazon.hsyal/.services.LoggerService in 5000ms 
I/ActivityManager( 236): Start proc com.amazon.kindle for broadcast com.amazon.kindle/.PrimeAppReceiver: pid=13075 uid=32022 gids={3003, 1015} 
W/ActivityManager( 236): Activity pause timeout for ActivityRecord{4173eb10 com.amazon.kindle.otter/.Launcher} 
I/ActivityManager( 236): Start proc com.android.settings for broadcast com.android.settings/.TopWindowChangereceiver: pid=13111 uid=1000 gids={1015, 3002, 3001, 3003} 
I/ActivityManager( 236): Start proc com.amazon.hsyal for service com.amazon.hsyal/.services.LoggerService: pid=13138 uid=10051 gids={} 
W/ActivityManager( 236): Activity destroy timeout for ActivityRecord{41750838 com.amazon.hsyal/.ui.VoltageSODLoggerActivity} 

和相应的线程代码如下:

public void run() { 
    // TODO Auto-generated method stub 
    dbInstance = new DbClass(ctx); 
    Log.d("Debuglogger","Came inside thread"); 
    ctx.registerReceiver(this.voltageReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

    Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      if(threadStatus == false){ 
       return; 
      } 
      if(!DataClass.dataList.isEmpty()){ 
       dbInstance.open(); 
       Iterator<DataClass> itr = DataClass.dataList.iterator(); 
       DataClass a_temp; 
       while(itr.hasNext()){ 
        a_temp = itr.next(); 
        dbInstance.createEntry(a_temp.getVoltage(), a_temp.getCurrent(), a_temp.getBattery_level(), 
          a_temp.getTime(), a_temp.getRtime()); 
       } 
       dbInstance.close(); 
       DataClass.dataList.clear(); 
       Log.d("db-error", "Data written to database and list cleared !"); 
      } 
     }}, 0, UPDATE_INTERVAL); 
} 
+0

发布logcat的相关部分,它你甚至可以在应用程序停止后检索('adb -logcat -d> log.txt') – Rajesh

+0

has al ook这里:http://snipt.org/vlC5 这是我可以看到我的包第一个错误 –

+0

这是相应的线程,其中错误正在提交:http://snipt.org/vlD3 –

回答

1

正如您从堆栈跟踪中看到的,当您从多个线程访问ArrayList时,错误似乎为java.util.ConcurrentModificationException。您可以在How to Avoid ConcurrentModificationException when using an Iterator看一看,它的相关部分如下:

要在多线程环境避免ConcurrentModificationException的:

  1. 您可以将列表转换为一个数组,然后在数组上进行迭代。这种方法适用于中小型列表,但如果列表很大,那么它会影响性能。

  2. 您可以在迭代时通过将其放入同步块来锁定列表。不推荐这种方法,因为它会停止多线程的好处。

  3. 如果您使用的是JDK1.5或更高版本,则可以使用ConcurrentHashMap和CopyOnWriteArrayList类。这是推荐的方法。


1.>我打开和关闭数据库中的每个10秒。我应该改变设计来关闭数据库,只有当整个应用程序完成。

没有太多的开销每10秒打开和关闭数据库。只有在出现性能问题时才想到这一点。

2.>我也采取了一个唤醒锁,但没有任何区别。我是否应该服用wakelock来服务我的服务?

似乎与特定问题无关。

3>最后一点我怎么来认识一下,因为其中的我的应用程序停止错误(我无法连接到USB知道怎么把我想的电池是在排出模式

希望你已经理解了如何做到这一点,只需要重申一下,即使在应用程序停止后 - 即通过DDMS或使用adb命令,你也可以获得logcat输出:adb logcat -d > log.txt

+0

你的答案似乎是正确的,我已经做出了改变,希望错误不会再来。 –

相关问题