使用递归方法遇到AsyncTask问题

时间:2013-02-28 21:24:53

标签: multithreading android-asynctask

我一直在阅读有关AsyncTasks和Hanlders以及Loopers的内容,但我仍然无法弄清楚我的代码在哪里出错了。我正在尝试运行代码来查看Tic Tac Toe网格并确定计算机的最佳移动。我希望这些代码在后台运行,因为它可能需要一些时间,然后我可以使用一个类似“我正在思考”的文本框来更新UI级别。我尝试了很多不同的方法,没有成功。

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个动作然后崩溃。当我在调试器中观察时,我看到正在创建名为Thread&lt;#&gt;的新主题。 AsyncTask#1。一旦我到达其中五个AsyncTasks,它就会回去试图抓住第一个AsyncTask并崩溃。当它崩溃时,我显示了ThreadPoolExecutor.class文件。

我还读过我不应该同时使用AsyncTask和Looper对象,所以我尝试将Loooper.prepare()语句取出,但是我的AsyncTask立即失败并显示错误消息:< / p>

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

我反复阅读过你不应该尝试从AsyncTask更新UI,而且上述错误通常是因为这一点,但GetBestMove没有更新UI线程。当我查看错误发生的位置时,它在调用构造函数时无法找到该类时失败。

有人能指出我正确的方向吗?我的最终目标是使用一个主线程和一个后台线程,并在计算机需要移动时继续重复使用后台线程。我知道当我以单线程方式运行此程序时,递归方法GetBestMove有效。但是随着方法的运行,屏幕会在某些动作中冻结太长时间。非常感谢你。

-NifflerX

1 个答案:

答案 0 :(得分:0)

为回答我自己的问题道歉,但我遇到的问题与递归无关。我正在调用的类是扩展类Activity,并且在尝试从AsyncTask调用它时,程序出错了。当我从类定义中删除extends活动时,它又开始工作了。对不起该帖子。

-NifflerX