5

Ho sviluppato applicazioni per l'OCR utilizzando tesseract Biblioteca,Applicazione uscire automaticamente senza alcun avviso o errore

Applicazione ottenuto uscita durante l'esecuzione di codice seguente:

/*... 
... 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; 
} 

dettaglio Logcat come segue:

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 

Sto convertendo Bitmap in oggetto Leptonica Pix rispetto a Pix in oggetto Leptonica Pixa e poi in riorganizzazione OCR.

Durante l'elaborazione, a volte la riorganizzazione OCR viene eseguita correttamente e talvolta la schermata iniziale di Android viene automaticamente.

Non so qual è il problema alla base di questo, e perché l'avviso RemoteException viene?

Please help me per risolvere questo problema.

Grazie,

+3

Su quale riga viene visualizzata l'eccezione? – rmtheis

+4

Questo è il problema, non viene generato alcun errore durante l'esecuzione dell'applicazione, ma mostra automaticamente la schermata Home e LogCat mostra solo un avviso W/InputManagerService (102): Ottenuto RemoteException inviando notifica SetActive (false) a pid 4880 uid 10062 –

+0

Questo avviso (W/InputManagerService potrebbe non significare nulla, perché l'ho spesso inserito in una app opengl funzionante, ma l'altra eccezione sopra menzionata è più interessante. –

risposta

4

Non è possibile terminare il baseApi tra l'AsyncTask. Questo è il problema che sei bloccato con il problema di arresto anomalo.

Hai utilizzato codice seguente,

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

commento la seguente riga e che cercare di eseguire l'applicazione, è possibile risolvere il problema.

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

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

Cancella automaticamente la memoria dell'heap in grado di implementare il seguente codice:

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"); 
    } 
} 
Problemi correlati