2013-05-06 3 views
1

클래스를 다음과 같이 정의했습니다. 코드 페이지가 있지만 가독성을 위해 관련 부분 만 게시하고 있습니다.runOnUIThread를 사용하기 위해 Activity를 소모하는 데 문제가 있습니까?

지금은 그다지 틀린 것은 없지만 그다지 효과적입니다.하지만 누군가 며칠 전 내가가는 수업에 '활동'을 확장하는 것이 좋지 않다고했습니다. 객체 만들기 (즉, 인스턴스를 만들 클래스) - 코드의 어느 시점에서 MyGLRenderer 객체를 만듭니다.

그래서 내 질문은 : 그것은 활동을 확장하는 '나쁜'

1)인가?

2) 만약 그렇다면 왜? 그렇다면

3), 어떻게 내 soundPool 클래스를 만들 runOnUIThread를 사용할 수 있습니까?

그렇다면 괜찮습니다.하지만 잠재적으로 커다란 문제가 발생할 수있는 경우 다른 사람이 내게 액세스 할 수있는 방법을 알려 주시면 감사하겠습니다.

(내 클래스는 외부 및 내부 클래스가 아닌 별도의 파일이므로이 클래스의 모든 initiallisation이있는 것처럼이 클래스에서 SoundPool 객체를 만들어야합니다.)

코드

public class MyGLRenderer extends Activity implements GLSurfaceView.Renderer{ 

//Various pieces of code 

public void onSurfaceChanged(){ 

runOnUiThread(new Runnable() { 
     public void run() { 
      sound = new soundMan(curView.getContext()); 

} 

}

답변

2

는 '나쁜'활동을 확장 할 수 있습니까?

실제 활동이 아니며 startActivity()에 의해 시작된 경우 '그렇다'입니다.

그렇다면 이유는 무엇입니까?

많은 일이 올바르게 작동하지 않으므로. runOnUiThread()이 작동한다는 것은 작은 기적이며, Activity이 수정되어 앞으로도 계속 작동 할 것이라는 보장은 없습니다. 사실, 일부 구형 장치 나 제조업체가 Activity을 사용하여 실제 작업을 수행하지만 사용자와 같은 오용으로 인해 작동하지 않는 방식으로 작동하지 않을 수도 있습니다.

그렇다면 어떻게 runOnUIThread를 사용하여 soundPool 클래스를 만들 수 있습니까?

그렇지 않습니다. View 또는 Handlerpost()을 호출하는 등의 다른 기능을 사용하여 주 응용 프로그램 스레드에서 수행 할 작업을 라우팅하십시오.

+0

안녕하세요 @ CommonSWare - 감사합니다. 매우 유익합니다. 감사합니다. 이상하게도, 내 주요 활동에는 startActivity()가 없습니다!어쨌든 runOnUIThread를 사용하기 위해 대체 (읽기 : 올바른) 방법을 사용하는 방법을 보여 주실 수 있습니까? 감사합니다. – Zippy

+0

@Zippy : "이상한, 내 주요 활동에 startActivity()가 없습니다. "-'startActivity()'는 누군가가 활동을 표시하기 위해 호출하는 것입니다. 예를 들어, 홈 화면은 사용자가 시작했을 때 "startActivity()"를 호출하여 "주 활동"을 시작합니다. "어쨌든 대안을 사용하는 방법을 보여 주실 수 있습니까?"-'post()'는 방법입니다. 'Handler' 또는'View'에서 호출합니다. 여기서'View'는 모든 위젯과 컨테이너의 기본 클래스입니다. runOnUiThread()와 함께 사용하는'Runnable'과 같은 종류의'post()'를 전달합니다. – CommonsWare

+0

Gotya, 지금 이해하고 있는데, 어떻게 작동하는지 (post()/runnable) 예제를 찾으려고 노력했지만 작동하지 않는 것 같습니다. 내가 구현할 수있는 방법을 보여주기 위해 답을 편집 할 수 있습니까? 이게 내 코드에요? 나는 시도했지만 '루퍼를 호출하지 않은 스레드 내부에서 핸들러를 생성 할 수 없습니다.'는 UI 스레드에서 생성해야하는 이유입니다. 고맙습니다. – Zippy