Android - 非UI线程的离屏绘制

5

简短版

是否允许在非UI线程中使用Android UI工具包?

编辑:最好提供官方Android文档中相关部分的引用。

详细版

Android文档明确指出,“禁止从UI线程以外的线程访问Android UI工具包”。

另一方面,从工作线程创建位图对象似乎是被允许的,至少在示例代码中已经这样做了: 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对象。

请问有人能够指导我去哪里查找文档,以证明我可以在后台线程中执行这些操作吗?还是说这样做会导致随机崩溃?

3个回答

4

UI工具包是指由Google提供的按钮、标签、列表视图等用户界面。主要原因是它们不是线程安全的,因此无法从非UI线程访问它们。

你正在使用的不是UI工具包,而是允许(实际上应该允许)从非UI线程访问的低级别Canvas。这种机制在游戏开发中经常使用。因此,我相信你是安全的。


我在问题中增加了对文档参考的更强烈需求。如果没有其他更好的答案,我将接受这个答案... - wolfgang
那篇文章似乎只是向主线程发送消息以使“游戏”视图失效。 - wolfgang

0

更新视图必须在UI线程上进行,或者通过post函数从远程线程上进行(基本上告诉UI线程远程线程想要完成某些任务),这是View类的一部分。


0

在内存中绘制位图时,它们只是独立存在,因此这应该是合法的。

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


它“应该”是这样的,但是再说一遍,Android的字体渲染代码可能使用了一些共享数据结构。它们是线程安全的吗? - wolfgang
很不幸,我们发现这段代码甚至没有尝试实现线程安全:https://dev59.com/pV3Va4cB1Zd3GeqPCq7U - miguel.de.icaza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接