gpt4 book ai didi

java - 这是 Android 线程的安全使用吗?

转载 作者:行者123 更新时间:2023-11-30 02:00:08 25 4
gpt4 key购买 nike

我使用原始 Android SDK 和线程在 Android 中创建了一个游戏。我的大部分游戏逻辑都包含在 Runnable 中,这些逻辑被发布到 Handlers 或 Views。

例如:

将 runnable 发布到 View 并在 runnable 中编辑该 View

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 中编辑一些 View

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);
}
}
});
}

在大多数情况下一切正常。 meteor 不断地产生和旋转。虽然非常非常罕见, meteor 会生成但不可见且不受伤害。我想知道这些奇怪的错误是否可能是由于我对游戏线程处理不当造成的。

我在 Android 文档中注意到了

[modifying] the ImageView from the worker thread instead of the UI thread...can result in undefined and unexpected behavior, which can be difficult and time-consuming to track down.

http://developer.android.com/guide/components/processes-and-threads.html

似乎第一个 fragment 可能没问题,而第二个 fragment 可能会导致问题(如果它没有在 UI 线程或其他东西上运行)。我在这里违反了 Android 最佳实践吗?

谢谢!

最佳答案

It seems like the first snippet may be fine, while the second could cause problems (if it's not running on UI thread or something). Am I violating Android best practices here?

spawningHandler 附加到 UI 线程 Looper,因为您在那里使用 View。否则你会崩溃,因为你不能从工作线程中做到这一点。

它是线程安全的,因为没有并行执行。您发布的所有 Runnable 都将转到相同的 MessageQueue。我在您发布的代码中没有看到线程问题。

关于java - 这是 Android 线程的安全使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31620005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com