2013-02-28 2 views
0

AsyncTasks 및 Hanlders and Loopers에 대해 읽었지만 코드에서 어디서 잘못 될지 알 수 없습니다. Tic Tac Toe 그리드를 살펴보고 컴퓨터에 대한 최선의 움직임을 결정하는 코드를 실행하려고합니다. 이 코드를 백그라운드에서 실행하려면 시간이 오래 걸릴 수 있습니다. 그런 다음 UI 레벨을 "생각 중"과 같은 텍스트 상자로 업데이트 할 수 있습니다. 나는이 방법을 여러 가지 방법으로 시도했으나 성공하지 못했습니다.재귀 메서드를 사용하여 AsyncTask에 문제가 발생했습니다.

private class PostTask extends AsyncTask<String, Integer, String> { 
    private Board _b; 
    private Welcome.Player _opp; 
    private int _depth; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    protected void SetVars(Board b, Player p, int depth){ 
     _b = b; 
     _opp = p; 
     _depth = depth; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     Looper.prepare(); 
     try{ 
      _bestMove = _b.GetBestMove(_opp,_depth); 
     } 
     catch(Exception err){ 
      _bestMove = -1; 
     } 
     return "All done"; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     if(_bestMove == -1){ 
      TextView tv = (TextView) findViewById(R.id.tv_Score); 
      tv.setText("Had and error, couldn't make a move."); 
     } 
     FollowUpComputerMove(this); 
    } 

위 코드는 정확히 5 개의 동작에 대해 작동하며 충돌이 발생합니다. 디버거에서 볼 때 스레드라는 이름의 새 테디가 생성되었습니다. < #> AsyncTask # 1. 일단 내가 AsyncTasks 중 다섯 개가되면 첫 번째 AsyncTask를 가져 와서 충돌합니다. 충돌이 발생하면 ThreadPoolExecutor.class 파일이 표시됩니다.

나는 AsyncTask와 Looper 객체를 함께 사용해서는 안되기 때문에 Loooper.prepare() 문을 꺼내려고 시도했지만 오류 메시지와 함께 즉시 AsyncTask가 실패합니다.

Can't create handler inside thread that has not called Looper.prepare() - AsyncTask inside a dialog 

나는 당신이 AsyncTask를에서 UI를 업데이트하려고해서는 안하고 종종 위의 오류가 그것 때문에이지만, GetBestMove는 UI 스레드를 업데이트되지 않도록 반복적으로 읽었습니다. 오류가 어디서 발생하는지 추적하기 위해 클래스를 찾을 수 없다는 생성자를 호출 할 때 오류가 발생합니다.

누구나 올바른 방향으로 나를 가리킬 수 있습니까? 나의 최종 목표는 하나의 메인 쓰레드와 하나의 백그라운드 쓰레드를 사용하고, 컴퓨터가 움직일 때마다 백그라운드 쓰레드를 계속 재사용하는 것이다. 나는이 프로그램을 단일 스레드 방식으로 실행할 때 재귀 적 메서드 인 GetBestMove가 작동한다는 것을 알고있다. 그러나 메서드가 실행될 때 화면이 너무 오랫동안 움직이면 멈 춥니 다. 정말 고맙습니다. 내 자신의 질문에 대답하기위한

는 -NifflerX

답변

0

죄송합니다,하지만 난이 직면 한 문제는 재귀와는 아무 상관이 없었다. 내가 호출했던 클래스는 Activity 클래스를 확장하는 것이었고 AsyncTask에서 호출하려고 시도하는 동안 프로그램이 오류를 일으켰다. 클래스 정의에서 extends Activity를 제거 할 때 다시 작업하기 시작했습니다. 미안 해요.

-NifflerX

관련 문제