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

标签 java android multithreading imageview

我使用原始 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/

相关文章:

java - 如何通过另一个线程停止一个线程?

c++ - 多线程时如何避免堆栈空间不足?

java - AffineTransform 修改的形状呈现出与预期相反的效果

android - android中的 Activity 滑动

java - 使用非静态公共(public)最终变量公开实例常量

android - 如何找出设备屏幕分辨率和密度以在模拟器和设备上设置相同的 UI 显示?

android - 设备策略 Controller (DCP) 应用程序和系统应用程序之间有什么区别?

android - 在同一进程中运行的两个应用程序是否可以具有不同的 STATIC 对象值?

Java OpenGL 相机

java - 我正在尝试添加两个系数不同且次数不同的多项式