Приложение автоматически закрывается без предупреждения или ошибки - PullRequest
5 голосов
/ 23 февраля 2012

Я разработал приложение для распознавания текста, используя библиотеку tesseract,

Приложение получило выход при выполнении следующего кода:

/*...
... Other Code stuff
...*/
    protected Boolean doInBackground(String... arg0) {

    /*...
    ... Other Code stuff
    ...*/
    Pix pix = getPixFromBitmap(bitmap);
    pix = preprocess(pix);
    Pixa pixa = slice(pix); // Code Updated

    try {
        baseApi.setPageSegMode(TessBaseAPI.PSM_SINGLE_LINE);

        int num = pixa.size();

        for (int i = 0; i < num; i++) {
            Pix pixi = pixa.getPix(i);

            /*...
            ... Other Code stuff
            ...*/
        }
        pixa.recycle();
        baseApi.end();

    } catch (RuntimeException e) {
Log.e("OcrRecognizeAsyncTask","Caught RuntimeException in request to Tesseract. Setting state to CONTINUOUS_STOPPED.");
        e.printStackTrace();
        try {
            // baseApi.clear();
            activity.stopHandler();
        } catch (NullPointerException e1) {
            // Continue
        }
        return false;
    }

    private Pixa slice(Pix pix) {
    HydrogenTextDetector htd = new HydrogenTextDetector();
    HydrogenTextDetector.Parameters hydrogenParams = htd.getParameters();
    hydrogenParams.debug = false;
    hydrogenParams.skew_enabled = true;
    htd.setParameters(hydrogenParams);

    htd.setSourceImage(pix);
    pix.recycle();
    htd.detectText();
    Pixa unsorted = htd.getTextAreas();
    Pixa pixa = unsorted.sort(Constants.L_SORT_BY_X, Constants.L_SORT_DECREASING);
    unsorted.recycle();
    htd.clear();
    return pixa;
}

Подробности Logcat следующим образом:

02-23 13:37:09.986: I/WindowManager(102): Setting rotation to 0, animFlags=1
02-23 13:37:10.006: I/ActivityManager(102): Config changed: { scale=1.0 imsi=405/30 loc=en_IN touch=3 keys=1/1/2 nav=3/1 orien=1 layout=17 uiMode=17 seq=33}
02-23 13:37:10.116: I/UsageStats(102): Unexpected resume of com.htc.launcher while  already resumed in edu.sfsu.cs.orange.ocr
02-23 13:37:10.816: W/InputManagerService(102): Got RemoteException sending setActive(false) notification to pid 4880 uid 10062

Я преобразую растровое изображение в объект Leptonica Pix, а не Pix в объект Leptonica Pixa, а затем выполняю реорганизацию OCR.

Во время обработки иногда реорганизация распознавания текста выполняется успешно, а иногда на главном экране Android появляется автоматически.

Я не знаю, в чем проблема, и почему RemoteException приходит предупреждение?

Пожалуйста, помогите мне решить эту проблему.

Спасибо

1 Ответ

4 голосов
/ 07 марта 2012

Вы не можете завершить baseApi между AsyncTask. Это проблема, с которой вы столкнулись при сбое.

Вы использовали следующий код,

pixa.recycle();
baseApi.end();

Прокомментируйте следующую строку и затем попытайтесь запустить приложение. Это может решить вашу проблему.

pixa.recycle();
// baseApi.end();

=============================================== ===================================

Очистите память кучи автоматически, вы можете реализовать следующий код:

public void onCreate(Bundle savedInstanceState) {
{
    clearMemoryCountDownTimer mClearMemoryCountDownTimer = new clearMemoryCountDownTimer(5000, 5000).start();
}
private class clearMemoryCountDownTimer extends CountDownTimer {

    public clearMemoryCountDownTimer(long millisInFuture,
            long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }

    @Override
    public void onFinish() {
        start();
        Log.i(TAG, "Timer Finished");
    }

    @Override
    public void onTick(long millisUntilFinished) {
        if (Debug.getNativeHeapFreeSize() < 100000) {
            clearMemory();
            Log.i(TAG, "requiredClearMemory");
        }
        Log.i(TAG, "getNativeHeapSize : " + Debug.getNativeHeapSize());
        Log.i(TAG,
                "getNativeHeapFreeSize : " + Debug.getNativeHeapFreeSize());
        Log.i(TAG,
                "getNativeHeapAllocatedSize : "
                        + Debug.getNativeHeapAllocatedSize());

    }

    void clearMemory() {
        Log.i(TAG, "System.gc()-Start");
        System.gc();
        Log.i(TAG, "System.gc()-End");
    }
}
...