2010-01-16 5 views
5

기본적으로 250K JNI를 감싸는 앱을 작성하고 있습니다. JNI (게임 엔진)에는 handle_penUp (int x, int y)와 같은 API가 있습니다. 때로는 handle_penUp()에서 (자바 코드로 콜백을 통해) 사용자를 쿼리해야하므로 쿼리를 구현하는 데 사용하는 대화 상자가 차단되어야합니다.JNI 코드 내에서 대화 차단하기

주 실행 스레드가 차단 될 수 없음을 이해합니다. 그래서 모든 JNI 호출을 만들어서 차단해야 할 콜백이 발생할 수있는 두 번째 스레드를 생성했습니다. 두 번째 스레드에서 블로킹 대화 상자를 열어야 할 때 startActivityForResult()를 호출 한 다음 세마포어에서 acquire()를 호출합니다. onActivityResult()가 주 스레드에서 호출되면 동일한 세마포어에서 release()를 호출합니다.

내 쿼리가 새 액티비티로 구현되었지만 기존 액티비티 내에서 showDialog()를 사용하려는 경우에는 작동하지 않습니다. 로그 메시지는 내 스레드에 루퍼가 필요하다는 것을 알려줍니다. 나는 하나를 추가 할 것이고 그것이 작동하는지에 대한 정보를 덧붙일 것이다 - 그러나 내가 잘못된 길로 내려가는 것처럼 느낀다. 내가 필요한 것은 블로킹 대화 상자를 만드는 방법입니다 (다른 모든 플랫폼에 포함되어 있기 때문에 유용합니다).

답변

0

확실히 두 개의 UI 스레드가 필요하지 않습니다. 제어 흐름 및 표시 (즉, 그림 그리기, 활동 시작, 대화 상자 표시 등과 관련된 모든 것)까지는 Android SDK와 통신하는 스레드가 하나만 있어야합니다.

스레드를 계속 실행하고 싶지는 않습니다. 모든 것은 이벤트를 기반으로하므로 코드가 무언가에 응답하고 무언가를 수행 한 다음 가능한 빨리 종료해야합니다.

"블록"이라고 말하면 정확히 무엇을 의미합니까? 무엇을 차단해야합니까? 이벤트에 대한 응답을 중지하기 만하면 대화 상자가 표시되어있는 동안 true로 설정된 부울을 가지지 않고 모든 이벤트를 무시하는 이유는 무엇입니까?

+0

IO 비 - 블로킹 (non-blocking) 아마 대 차단과 같이 블록 (호출이 될 때까지 반환하지 않습니다

제이슨 도움이되기를 바랍니다 요청 된 입력을 얻었거나 실패했습니다. 즉, 즉시 반환하고 버퍼에 이미있는 경우 입력을보고합니다.) –

2

터치 스레드에서 일부보기를 표시/숨김으로 설정했을 때의 문제와 매우 비슷하게 들립니다.

문제가 당신이

무엇 당신이해야 할 것은 당신의 메인 쓰레드의 핸들을 사용하는 것입니다 (귀하의 경우 이는) 다른 스레드를 형성하는 GUI에 대한 몇 가지 작업을 할 수 없다는 것입니다 나는 그것을 선언 활동

public static final Handler handlerVisibility = new Handler() { 
    public void handleMessage(Message msg) { 
     int visibility = msg.getData().getInt("visibility"); 
     view.setVisibility(visibility); 
    } 
}; 

는 내가 어디에서 액세스 할 수 있도록 공공 정적의 옵션을 선택했다 (I는 한 번에 둘 이상의 통화를하지 않아도 때문에와 나는 서브 클래스에 함께 전달할 게으른 느꼈다).

은 싶은 것은이 핸들러에 메시지를 보내고있는 핸들러는 루퍼 오류를 해결하는 방법을 허용해야 그것이 ^^

Message msg = MainActivity.handlerVisibility.obtainMessage(); 
    Bundle b = new Bundle(); 
      b.putInt("visibility", View.VISIBLE); 
    msg.setData(b); 
      MainActivity.handlerVisibility.sendMessage(msg); 

를 작동하는 GUI와 같은 스레드에 있기 때문에 다른

하나 개의 스레드에서 GUI 요청을 보낼 수는