【问题标题】:Is this a safe usage of Android Threading?这是 Android 线程的安全使用吗?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的浏览。我以为spawningHandler 已附加到 UI 线程,但我想仔细检查。
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多