5

tôi đã phát triển ứng dụng cho OCR sử dụng Tesseract Thư viện,Application thoát tự động mà không cần bất kỳ cảnh báo hay lỗi

Ứng dụng có lối ra trong việc thực hiện các đoạn mã sau:

/*... 
... 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 chi tiết như sau:

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 

Tôi đang chuyển đổi bitmap thành đối tượng Leptonica Pix so với Pix thành đối tượng Leptonica Pixa và hơn là thực hiện sắp xếp lại OCR.

Trong quá trình xử lý, đôi khi việc tổ chức lại OCR được thực hiện thành công và đôi khi, màn hình chính của Android tự động xuất hiện.

Tôi không biết vấn đề đằng sau điều đó là gì và tại sao cảnh báo RemoteException xuất hiện?

Vui lòng giúp tôi giải quyết vấn đề này.

Xin cảm ơn,

+3

Bạn thấy ngoại lệ nào? – rmtheis

+4

Đó là vấn đề, Không có lỗi nào xảy ra khi thực thi ứng dụng, nhưng nó tự động hiển thị Màn hình chính và LogCat chỉ hiển thị một Cảnh báo W/InputManagerService (102): Got RemoteException gửi thông báo setActive (false) tới 4880 uid 10062 –

+0

Cảnh báo này (W/InputManagerService có thể không có nghĩa là bất cứ điều gì, bởi vì tôi đã thường xuyên có nó trong một ứng dụng opengl cũng làm việc. Nhưng Ngoại lệ khác, metioned ở trên là thú vị hơn. –

Trả lời

4

Bạn không thể kết thúc baseApi ở giữa AsyncTask. Đó là vấn đề bạn đang mắc kẹt với vấn đề crashing.

Bạn đã sử dụng đoạn mã sau,

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

Comment dòng sau và vì cố gắng chạy các ứng dụng, Nó có thể giải quyết vấn đề của bạn.

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

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

Xóa bộ nhớ heap tự động bạn có thể triển khai mã sau:

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"); 
    } 
} 
Các vấn đề liên quan