[英]Getting Updated UI in Android using Asynctask
我正在用android构建迷宫游戏(用于学校作业),但无法让自动驱动程序正常工作。 游戏对于手动迷宫探索工作正常,但是当我尝试使用驱动程序探索迷宫时,图形不会更新到视图。 我知道我必须以某种方式使用处理程序,但是在这件事上我有点迷茫。 下面的一些代码块可能有助于使事情更加清楚。
这是在PlayActivity中:
class RobotTask extends AsyncTask<Integer , Void , Void> {
@Override
protected Void doInBackground(Integer... params) {
robotDriver.setView(mazeView);
try {
if(robotDriver.drive2Exit()) {
Intent finishIntent = new Intent(PlayActivity.this, FinishActivity.class);
startActivity(finishIntent);
}
} catch (Exception e) {
Toast.makeText(PlayActivity.this, "Robot Ran Out Of Power", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(PlayActivity.this , AMazeActivity.class);
NavUtils.navigateUpTo(PlayActivity.this, intent);
}
return null;
}
然后,robotDriver.drive2Exit()调用特定的探索算法来移动机器人,该代码在下面(并非全部,只是我认为需要更改的地方):
if(forward)
try {
Thread.sleep(250);
robot.move(1, true);
this.mazeView.postInvalidate();
} catch (HitObstacleException e) {
// TODO Auto-generated catch block
e.printStackTrace(); }
else {
try {
robot.rotate(90); // turn then move
this.mazeView.postInvalidate();
Thread.sleep(250);
robot.move(1, true);
this.mazeView.postInvalidate();
Thread.sleep(500);
} catch (HitObstacleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}
}
robot.move()和rotate()在迷宫中移动机器人,然后更新我用来展示firstpersonview的两个抽屉类。 这些更新更新了mazeView中的位图,我希望在那里可以通过postInvalidate()调用将这些更新提供给查看器。
任何想法都会有所帮助。
我认为您不能直接从doInBackground()方法开始活动,也无法从辅助线程更新视图。 所有这些操作(Intent,Toast)都必须在UI线程中完成
我认为您的问题是,您正在尝试执行一些应在不是您的UI线程的线程上更新UI线程的过程。 您是否希望此过程在您的UI线程上运行并相应地进行更新,或者您不希望这样做。 根据文档, postInvalidate()
会导致在事件循环的后续周期中发生无效。 因此,您应该在UI线程中的mazeview上调用invalidate()。 要解决此问题,您必须将代码重新组织为以下内容。 制作一个异步类来执行机器人的移动计算:
private final Robot robot;
public class RobotWorker extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
//implement locking / synchronization here
if( forward ) {//pas as a param
try{
Thread.sleep(250);
robot.move(1,true);
}catch( HitObstacleException e ){
e.printStackTrace();
}
}
else{
try{
robot.rotate(90);
Thread.sleep(250);
}catch( HitObstacleException e ){
e.printStackTrace();
}
}
return null;
}
}
在你的UI线程上做这样的事情
public void myRobotMover(){
//implement locking / synchroniztion
new RobotWorker().execute();
mazeView.invalidate();
}
同样,您将必须实现一些同步和锁定。 在这里了解如何。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.