【问题标题】:Android App crashed after some timeAndroid应用程序在一段时间后崩溃
【发布时间】:2014-01-22 02:26:53
【问题描述】:

我有一个问题,我不知道导致崩溃的原因。我有一个 Timer 内部类,每分钟从MainActivityonCreate() 触发。

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

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

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   android.app.ApplicationThreadProxy@4275bf18 (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: android.os.BinderProxy@42976028
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}

然后想到它可能是内存泄漏引起的,然后我将计时器周期缩短到 10 秒。正如预期的那样,它在 2.5 小时后坠毁。

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

这是清单。

<?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
  • 如果你对每种情况都有 startActivityforresult 那么为什么 scheduleAtFixedRate ,使用 new Timer().schedule(task, after) 代替。
  • 谢谢曼莫汉。 scheduleAtFixedRate 的目的是重复启动 CaptureActivity 以测试应用重复进入 CaptureActivity 是否会崩溃。
  • @jwgan 您是否已将所有活动添加到清单中?愿意发布吗?

标签: java android timer


【解决方案1】:

不是一个实际的答案,但您应该将您的 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);

}

除了重复次数更少之外,它的作用完全相同。

【讨论】:

  • 注意。非常感谢
【解决方案2】:

异常显示“java.lang.SecurityException: Not allowed to start activity Intent { cmp=com.handalindah.manjalinkkiosk/tw.com.quickmark.sdk.CaptureActivity }”。

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

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2012-06-21
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多