2014-01-22 119 views
0

我有一个问题,我不知道是什么导致崩溃的线索。我有一个内部类的定时器,每分钟从MainActivityonCreate()触发。Android应用程序在一段时间后崩溃

timer = new Timer(); 
timer.scheduleAtFixedRate(new RemindTask(),2000, 10000); 

这是我的Timer类。这个计时器类负责启动另一个活动。

class RemindTask extends TimerTask { 

public CaptureActivityHandler cah = new CaptureActivityHandler(); 
public void run() { 
    Log.d("TIMER", "timer is triggered"); 
    TimerCount++; 

    if(TimerCount > 1) 
    { 
     Log.d("TIMER", "TimerCount > 1"); 
     boolean flag = cah.getDecodeFlag(); 

     if(flag){ 
      Log.d("TIMER", "decodeFlag true"); 
      cah.setDecodeFlag(false); 
      Intent intent = new Intent(MainActivity.this,CaptureActivity.class); 
      startActivityForResult(intent,SCAN_QRCODE_REQUEST); 
     } 
     else 
     { 
      Intent intent = new Intent(MainActivity.this,CaptureActivity.class); 
      startActivityForResult(intent,SCAN_QRCODE_REQUEST); 
     } 
    } 
    else { 
     Intent intent = new Intent(MainActivity.this,CaptureActivity.class); 
     startActivityForResult(intent,SCAN_QRCODE_REQUEST); 
    } 
    } 
} 

问题是应用程序在15小时后崩溃。 Logcat显示:

01-21 11:01:42.027: W/dalvikvm(30401): threadid=11: thread exiting with uncaught exception (group=0x41ddd930) 
01-21 11:01:42.027: W/ActivityManager(363): Unable to find app for caller [email protected] (pid=-1) when starting: Intent { cmp=com.handalindah.manjalinkkiosk/tw.com.quickmark.sdk.CaptureActivity } 
01-21 11:01:42.027: E/AndroidRuntime(30401): FATAL EXCEPTION: Timer-0 
01-21 11:01:42.027: E/AndroidRuntime(30401): java.lang.SecurityException: Not allowed to start activity Intent { cmp=com.handalindah.manjalinkkiosk/tw.com.quickmark.sdk.CaptureActivity } 
01-21 11:01:42.027: E/AndroidRuntime(30401): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1625) 
01-21 11:01:42.027: E/AndroidRuntime(30401): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417) 
01-21 11:01:42.027: E/AndroidRuntime(30401): at android.app.Activity.startActivityForResult(Activity.java:3370) 
01-21 11:01:42.027: E/AndroidRuntime(30401): at android.app.Activity.startActivityForResult(Activity.java:3331) 
01-21 11:01:42.027: E/AndroidRuntime(30401): at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:839) 
01-21 11:01:42.027: E/AndroidRuntime(30401): at com.handalindah.manjalinkkiosk.MainActivity$RemindTask.run(MainActivity.java:562) 
01-21 11:01:42.027: E/AndroidRuntime(30401): at java.util.Timer$TimerImpl.run(Timer.java:284) 
01-21 11:01:42.037: W/ActivityManager(363): Can't find mystery application for Crash from pid=30401 uid=10079: [email protected] 
01-21 11:01:42.037: I/Process(30401): Sending signal. PID: 30401 SIG: 9 
01-21 11:01:42.147: W/InputDispatcher(363): channel '42600fd8 com.handalindah.manjalinkkiosk/com.handalindah.manjalinkkiosk.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9 
01-21 11:01:42.147: E/InputDispatcher(363): channel '42600fd8 com.handalindah.manjalinkkiosk/com.handalindah.manjalinkkiosk.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 
01-21 11:01:42.147: W/InputDispatcher(363): Attempted to unregister already unregistered input channel '42600fd8 com.handalindah.manjalinkkiosk/com.handalindah.manjalinkkiosk.MainActivity (server)' 
01-21 11:01:42.147: I/WindowState(363): WIN DEATH: Window{42600fd8 u0 com.handalindah.manjalinkkiosk/com.handalindah.manjalinkkiosk.MainActivity} 

然后想到它可能会导致内存泄漏,然后我把计时器周期缩短到10secs。如预期的那样,它在2.5小时后坠毁。

但是,这似乎不太可能是因为内存,因为使用的堆大小总是大约58%。此外,内存使用率约为4%,这是设备内存100%中的35%。

这是清单。

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.test" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.front" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

<application 
    android:largeHeap="true" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.test.MainActivity" 
     android:label="@string/app_name" 
     android:launchMode="singleTop"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="tw.com.quickmark.sdk.CaptureActivity" 
     android:configChanges="orientation|keyboardHidden" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 
     android:launchMode="singleTop"> 

    </activity> 
    <activity android:name="tw.com.quickmark.sdk.PreferencesActivity" > 
    </activity> 

    <service 
     android:name="com.example.test.MySpiceService" 
     android:exported="false" > 
    </service> 
</application> 
</manifest> 

任何想到什么可能导致崩溃?

+0

你可以发布你的CaptureActivity.java – Ogen

+0

如果你有startActivityforresult每个case然后为什么scheduleAtFixedRate使用新的Timer()。schedule(task,after)来代替。 – Manmohan

+0

感谢Manmohan。 scheduleAtFixedRate的用途是反复启动CaptureActivity,以测试应用程序是否会在重复进入CaptureActivity时崩溃。 – jwgan

回答

0

不是一个实际的答案,但你应该改变你的run()方法来此...

public void run() { 
    Log.d("TIMER", "timer is triggered"); 
    TimerCount++; 

    if (TimerCount > 1) { 
     Log.d("TIMER", "TimerCount > 1"); 
     boolean flag = cah.getDecodeFlag(); 

     if(flag){ 
      Log.d("TIMER", "decodeFlag true"); 
      cah.setDecodeFlag(false); 
     } 
    } 

    Intent intent = new Intent(MainActivity.this,CaptureActivity.class); 
      startActivityForResult(intent,SCAN_QRCODE_REQUEST); 

} 

它做同样的事情,除了用更少的重复。

+0

注意,非常感谢 – jwgan

0

异常显示“java.lang.SecurityException:不允许启动活动意图{cmp = com.handalindah.manjalinkkiosk/tw.com.quickmark.sdk.CaptureActivity}”。

tw.com.quickmark.sdk.CaptureActivity在某些运行后未注册?