我有一個問題,我不知道是什麼導致崩潰的線索。我有一個內部類的定時器,每分鐘從MainActivity
onCreate()
觸發。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>
任何想到什麼可能導致崩潰?
你可以發佈你的CaptureActivity.java – Ogen
如果你有startActivityforresult每個case然後爲什麼scheduleAtFixedRate使用新的Timer()。schedule(task,after)來代替。 – Manmohan
感謝Manmohan。 scheduleAtFixedRate的用途是反覆啓動CaptureActivity,以測試應用程序是否會在重複進入CaptureActivity時崩潰。 – jwgan