나는 게임을 쓴 나는 일반적인 구조 다음 (코드가 훨씬 단순화를하고있다) 보유하고있는 (내가 그것을 이름 "게이머"를주지) :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() 코드를 추가하여이 문제를 해결할 수 있다고 생각합니다.
제발 누가 더 쉬울 지 말해 줄 수 있습니다. 필요한 코드는 어디에서 가져 가야합니까?
이 코드는 어디에 있습니까? – Mick
당신은 스레드에서 대화 상자를 표시하여 스레드가 UI를 만지거나 수정할 수 없다고 말하면 UIThread 만 스레드를 UI로 수정할 수 있습니다 (대화 상자 만들기, views, modifiying views ... 등) runOnUIThread() 메서드를 재정의하여 스레드가 UIThread에서 해당 코드를 실행하도록해야합니다. – Houcine
또는 AsyncTask를 사용할 수 있습니다. – Houcine