我一直在阅读有关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
答案 0 :(得分:0)
为回答我自己的问题道歉,但我遇到的问题与递归无关。我正在调用的类是扩展类Activity,并且在尝试从AsyncTask调用它时,程序出错了。当我从类定义中删除extends活动时,它又开始工作了。对不起该帖子。
-NifflerX