문제

나는 현재 안드로이드를 잡고 음력 랜더 샘플을 가지고 놀고 있습니다.

앱에서 멀리 이동하면 (예 : 호출 버튼을 누르면) 기본 표면이 파괴된다는 것을 알았습니다 (통화 surfaceDestroyed).

다시 탐색 (트리거됩니다 onWindowVisibilityChanged) 앱은 충돌이 발생합니다.

내가 넣을 수있는 코드가 있습니까? onWindowVisibilityChanged (또는 다른 곳) SurfaceView의 기본 표면을 재생하고 실행을 멋지게 재개 할 수 있습니까?

이것은 간단한 기능 호출이어야한다고 생각하지만 API 문서에서는 아무것도 찾을 수 없습니다.

감사!

도움이 되었습니까?

해결책 2

잘못 진단! 앱은 표면을 자동으로 재창조하지만, 생성되기 전에 그에 그려지는 전화가 있습니다.

문제 해결 :

boolean mSurfaceExists;
...
public void surfaceDestroyed(SurfaceHolder holder) {
    mSurfaceExists = false;
    ...
}

public void surfaceCreated(SurfaceHolder holder) {
    mSurfaceExists = true;
    ...
}

protected void onWindowVisibilityChanged(int visibility) {
    // only call base if there's a surface
    if(mSurfaceExists)
        super.onWindowVisibilityChanged(visibility);
}

이제 모두 부풀어 오릅니다. (내가 알고있는 한, 어쨌든 - Java/Android 전문가들은 이것이 나쁜 연습인지 자유롭게 언급하십시오!)

다른 팁

"msurfaceexists = true"에 대한이 솔루션은 나에게도 작동하지 않습니다. super.onwindowvisabilitychanged ()가 호출되지 않기 때문에 Surfacecreated ()가 호출되지 않은 것처럼 보입니다. 따라서 표면이 생성되지 않으며 Threas.start가 호출되지 않기 때문에 충돌하지 않습니다.

문제는 다음이라고 생각합니다. stread.start ()는 스레드가 이미 시작되었으므로 오류가 발생합니다. 그러나 SurfacedEstroyed ()에서 Thread.join은 스레드가 완성되고 죽게됩니다. 그리고 일단 죽으면 실을 다시 시작할 수 없습니다.

트릭은 Surfacecreated에서 새 스레드를 생성하거나 사용자가 응용 프로그램을 호출하여 (후 키) 멈추지 않고 (홈 키)를 완료 할 때만 스레드를 완료하는 것입니다. 활동에서 isfinishing ()을 호출하여 확인할 수 있습니다.

이것이 작동하는지 확실하지 않습니다. 나는 곧 이것을 시도 할 것이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top