【发布时间】:2015-07-24 21:23:37
【问题描述】:
我使用 vanilla Android SDK 和线程在 Android 中创建了一个游戏。我的大部分游戏逻辑都包含在 Runnables 中,它们发布到 Handlers 或 Views。
例如:
将 runnable 发布到视图并在 runnable 中编辑该视图
private int currentRotation =0;
private Runnable rotateRunnable = new Runnable(){
@Override
public void run() {
currentRotation+=DEFAULT_ROTATION_SPEED * direction;
Gravity_MeteorView.this.setRotation(currentRotation);
Gravity_MeteorView.this.postIfAlive(this,2*MovingView.HOW_OFTEN_TO_MOVE);
}
};
public Gravity_MeteorView(Context context) {
super(context);//ImageView
//...
this.post(rotateRunnable);
}
将 Runnable 发布到处理程序并在 Runnable 中编辑一些视图
Handler spawningHandler = new Handler();
public final void spawnMeteorShower(final int numMeteors,final int millisecondsBetweenEachMeteor) {
spawningHandler.post(
new Runnable(){
private int numSpawned=0;
@Override
public void run() {
Gravity_MeteorView bob = new Gravity_MeteorView(context);
someLayout.addView(bob);
//...
if(numSpawned<numMeteors){
spawningHandler.postDelayed(this,millisecondsBetweenEachMeteor);
}
}
});
}
在大多数情况下,一切正常。流星不断产生和旋转。不过,非常非常罕见的是,流星会生成,但它们是不可见的并且不会受到伤害。我想知道这些奇怪的错误是否是由于我对游戏线程处理不当造成的。
我在 Android 文档中注意到了
从工作线程而不是 UI 线程[修改] ImageView...可能会导致未定义和意外行为,这可能难以追踪且耗时。
http://developer.android.com/guide/components/processes-and-threads.html
似乎第一个 sn-p 可能没问题,而第二个可能会导致问题(如果它不在 UI 线程或其他东西上运行)。我是否违反了 Android 最佳实践?
谢谢!
【问题讨论】:
-
U 使用来自活动线程的 looper,所以基本上 yr 处理程序在活动线程(又名 ui 线程,又名主线程)上执行 runnables - 处理程序就像一个 Crowbar 在循环中创建一个孔“漏洞”,该漏洞存在于线程中发布代码在这个循环中执行
标签: java android multithreading imageview