2017-12-04 8 views
0

android에 대해 Tess-two 기반 OCR 시스템을 작성하고 이상한 장애물을 발견했습니다. 사실과 연결 TextureView 사용 Camera를 더 이상 사용되지 않으며 내 화웨이 P8에이 코드를 실행하려고하면 isAlive()이 날을 제공하는 경우Thread.start()가 호출 될 때 onSurfaceTextureUpdated에서 예외가 발생했습니다.

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.user.myApp, PID: 18386 
java.lang.IllegalThreadStateException: Thread already started 
at java.lang.Thread.checkNotStarted(Thread.java:864) 
at java.lang.Thread.start(Thread.java:1074) [...] 

내가 그 생각 :

@Override 
public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
    Log.d("frame", "update frame"); 
    if(btmQueue.size()<10) 
     btmQueue.add(mTextureView.getBitmap()); 
    System.out.println(mOCRWorker.isAlive()); 
    if(mOCRWorker.isAlive()==false) 
    { 
     mOCRWorker.start(); 
    } 
} 

Thread mOCRWorker = new Thread(new Runnable() { 

    @Override 
    public void run() { 
     Log.d("Ocr:", "Running thread!"); 
     if(apiInit==true) { 
      if (btmQueue.size() > 0) { 
       Bitmap bmp = btmQueue.pollFirst(); 
       baseAPI.setImage(bmp); 
       String recognizedText = baseAPI.getUTF8Text(); 
       Log.d("Recognized: ", recognizedText); 
      } 
     } 
     Log.d("Ocr:", "Thread finished!"); 

    } 
}); 

나는이 오류 거짓이면 실은 실제로 죽습니다. 무슨 일이 일어나고 있는지 단서가 있습니까?

+0

그리고 더 - 스레드가 한 번 실행됩니다 : 스레드에서 첫 번째 및 두 번째 로그 메시지를 수신 한 다음 오류가 발생합니다! –

답변

0

Okey, 알아 냈습니다 : 메서드 start()는 임의의 스레드에 대해 두 번 이상 호출 할 수 없습니다. 특히 스레드가 실행될 때 특히 그렇습니다. while (ocrShouldWork) 루프를 내 스레드 안에 넣어서 사용하지 않을 때까지 계속 작동시킵니다.