【问题标题】:Android - Offscreen Drawing from non-UI threadAndroid - 来自非 UI 线程的屏幕外绘图
【发布时间】:2011-11-27 18:59:17
【问题描述】:

短篇

是否允许,还是我需要使用 UI 线程?

编辑:在官方 android 文档中引用一个地方是理想的。

加长版

Android 文档明确表示不允许“从 UI 线程外部访问 Android UI 工具包”。

另一方面,似乎允许从工作线程创建 Bitmap 对象,至少它是在示例代码中完成的: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html 显然,就线程而言,Bitmap 类不被视为“UI 工具包”的一部分。

我有一段代码在从非 UI 线程调用时似乎可以工作。它涉及使用 Bitmap.createBitmap(int,int,Bitmap.Config)、new Canvas(bitmap)、Typeface.create() 和文本绘制。我的代码没有引用任何 View 对象。

有人可以指出我可以从后台线程执行这些操作的文档吗?或者这样做会导致随机崩溃?

【问题讨论】:

    标签: android multithreading android-canvas


    【解决方案1】:

    UI工具包是指谷歌提供的按钮、标签、列表视图等UI。您不能从非 ui 线程访问它们,主要是因为它们不是线程安全的。

    您所做的不是在 UI 工具包上,而是在允许(实际上应该允许)从非 UI 线程访问的低级 Canvas 上。这种机制一直用于游戏开发。所以我相信你是安全的。

    【讨论】:

    • 我增加了对该问题的文档参考的强烈要求。如果我没有得到任何答案,我会接受这个答案...
    • 那篇文章似乎只是在向主线程发送消息,以使“游戏”视图无效。
    【解决方案2】:

    更新视图必须在 UI 线程上进行,或者从具有 post 功能的远程线程(基本上告诉 UI 线程远程线程想要做某事),这是 View 类的一部分。

    【讨论】:

      【解决方案3】:

      这应该是合法的,因为位图在你绘制它们之前就单独存在于内存中。

      我正在研究游戏开发,似乎有一些线程也在更新 UI(使用类似的内存渲染技术)

      【讨论】:

      • 应该是,不过话说回来,android的字体渲染代码可能使用了一些共享数据结构。它们是线程安全的吗?
      • 不太可能,我们发现这段代码甚至没有尝试线程安全:stackoverflow.com/questions/8288155/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      相关资源
      最近更新 更多