2012-01-26 2 views
2

나는 게임을 쓴 나는 일반적인 구조 다음 (코드가 훨씬 단순화를하고있다) 보유하고있는 (내가 그것을 이름 "게이머"를주지) :android 앱의 기본 스레드는 어디에 있습니까?

public class Gamer extends Activity implements View.OnClickListener 
{ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     mpt = new MicksPanelThing(this); 
    } 
} 
public class MicksPanelThing extends SurfaceView implements SurfaceHolder.Callback 
{ 
    public MicksPanelThing(Context context) 
    { 
     super(context); 
     micks_thread_thing = new MicksThreadThing(getHolder(), this); 
     getHolder().addCallback(this); 
     setFocusable(true); 
    } 
    void updateView() 
    { 
     final SurfaceHolder holder = getHolder(); 

     try 
     { 
      Canvas canvas = holder.lockCanvas(); 
     if(canvas != null) 
      { 
      onDraw(canvas); 
      holder.unlockCanvasAndPost(canvas); 
     } 
     } 
     catch (Exception e) 
     { 
     e.printStackTrace(); 
     } 
    } 
    public void onDraw(Canvas canvas) 
    { 
     // blah 
    } 

} 
class MicksThreadThing extends Thread 
{ 
    public MicksThreadThing(SurfaceHolder surfaceHolder, MicksPanelThing mpt) 
    { 
     // blah 
    } 
    public void run() 
    { 
     while (this_thread_is_currently_active) 
     { 
      micks_panel_thing.updateView(); 
     } 
    } 
} 

게임이었다 모든 작업 벌금과 매우 견고했습니다. 이제 특정 조건을 테스트하고 싶다면 AlertDialog를 사용하십시오. 필자는이 코드를 내 onDraw 메서드 내에 넣을 수 있다고 생각했습니다. 그런 다음 "Looper.prepare()를 호출하지 않은 스레드 내부에서 핸들러를 생성 할 수 없습니다"라는 메시지가 나타납니다. onDraw 메소드가 주 스레드에서 실행되고 있다고 가정했기 때문에 혼란 스럽습니다. 뭐든 준비해.

필자는 테스트와 대화 상자를 메인 스레드 (어디에서?)로 옮기거나 어딘가에 Looper.prepare() 코드를 추가하여이 문제를 해결할 수 있다고 생각합니다.

제발 누가 더 쉬울 지 말해 줄 수 있습니다. 필요한 코드는 어디에서 가져 가야합니까?

답변

2

이 방법을 사용하려고 대신 Thread를 사용, 당신이 사용할 수있는 AsyncTask

+0

이 코드는 어디에 있습니까? – Mick

+0

당신은 스레드에서 대화 상자를 표시하여 스레드가 UI를 만지거나 수정할 수 없다고 말하면 UIThread 만 스레드를 UI로 수정할 수 있습니다 (대화 상자 만들기, views, modifiying views ... 등) runOnUIThread() 메서드를 재정의하여 스레드가 UIThread에서 해당 코드를 실행하도록해야합니다. – Houcine

+0

또는 AsyncTask를 사용할 수 있습니다. – Houcine

0

MicksThreadThing에서 onDraw(canvas);으로 전화하십시오. 분명히, 그것은 응용 프로그램의 주요 스레드가 아닙니다. 주요 스레드는 귀하의 활동 중 onCreate()이 호출되는 스레드입니다.

0

일반 스레드에서 UI를 업데이트 할 수 없습니다. UI 업데이트에는 runOnUiThread()을 사용하십시오.

class MicksThreadThing extends Thread 
{ 
    public MicksThreadThing(SurfaceHolder surfaceHolder, MicksPanelThing mpt) 
    { 
     // blah 
    } 
    public void run() 
    { 
     Gamer.this.runOnUiThread(new Runnable(){ 
     @Override 
     public void run(){ 
      //update/create your views here 
      while (this_thread_is_currently_active) 
      { 
       micks_panel_thing.updateView(); 
      } 
     } 
    }); 
    } 
} 

다른 솔루션은 다음과 같습니다 :합니다 (UIThread 임) mainThread에 코드를 실행하는 응용 프로그램을 강제로 runOnUIThread() 예 :

1

이 방법으로 그것을 수행

class MicksThreadThing extends Thread 
{ 
    public MicksThreadThing(SurfaceHolder surfaceHolder, MicksPanelThing mpt) 
    { 
     // blah 
    } 
    public void run() 
    { 
     while (this_thread_is_currently_active) 
     { 
      //micks_panel_thing.updateView(); 

      Gamer.this.runOnUiThread(new Runnable(){ 
       @Override 
       public void run(){ 
        micks_panel_thing.updateView(); 
       } 
      }); 
     } 
    } 
} 
+0

은 오타를 실행하는 그 실행입니까? – Mick

+0

아니요 ... Gamer.this.runOnUiThread가 UI 스레드에서 실행됩니다. – waqaslam

+0

흠 ... 코드가 잘 컴파일되고 게임 상태가 그려지는 것을 볼 수 있지만 터치 이벤트에 응답하지 않습니다. .. 잊어 버릴지도 모르는 것이 있습니까? – Mick

0

기본 스레드는 UI 스레드이므로 ... 에 Handler 또는 onPostExecute() or onPreexecute()을 사용할 수 있습니다.

관련 문제