【问题标题】:How to update SurfaceView from another Thread?如何从另一个线程更新 SurfaceView?
【发布时间】:2014-08-19 10:06:52
【问题描述】:

我有一个线程,我会一一得到一些Bitmap。然后,每当我得到一个新的Bitmap 时,我都需要更新我的SurfaceView,它位于主线程中。我该怎么做?

【问题讨论】:

  • 检查这个问题stackoverflow.com/questions/24890900/… 看看它是否有帮助
  • activity.runOnUiThread(new Runnable() { public void run() { updateMySurfaceView(bitmap);}});
  • @stealthjong 如果你能把它作为一个完整的答案,我会接受它。

标签: android bitmap surfaceview surfaceholder


【解决方案1】:

这是一些伪代码

new Thread() {
    public void run() {
        while (bitmapIncoming()) {
            Bitmap bitmap = getNextBitmapAfterLongOperation();
            mActivityReference.runOnUiThread(new Runnable() {
                public void run() {
                    mActivityReference.updateSurfaceView(bitmap);
                }
            });
        }
    }
}.start();

【讨论】:

    【解决方案2】:

    在线程中,创建一个公共接口,该接口定义一个函数,每次检索位图时都会调用该函数(我假设来自互联网),例如:

    public interface ImageRetrievedListener{
      public void onImageReceived(Bitmap bitmap);
    }
    

    在使用 Surface View 的 Activity 中实现此方法,并在 onImageReceived 回调中,将接收到的 Bitmap 添加到 SurfaceView 使用的 Bitmaps 数组中。应该可以,如果还有问题,请告诉我。

    //编辑 不确定这是否是解决此问题的最佳解决方案,但我会以这种方式解决。

    【讨论】:

    • 我怀疑这会起作用,因为该方法仍然是从非 UI 线程调用的
    • 哦,只需使用 runOnUiThread 方法让它在 UI 线程上运行.. 而且,我们在这里没有做任何与 UI 相关的工作,所以无论如何它不应该是一个问题.. 尝试让我知道它是怎么回事。
    • 我知道,但是,OP 正在做与 UI 相关的工作,他正在用位图更新他的表面视图。
    • 没错,我们只是在更新数组.. 向它添加一个新的位图,在后台线程中,UI 线程正在使用该数组进行 UI 绘制..
    • 如果您从一个线程更新数组,并从另一个线程读取它,则需要同步访问。
    猜你喜欢
    • 2020-07-13
    相关资源
    最近更新 更多