我们有一个Phonegap/Cordova (1.6.0)应用程序,它的UI使用SenchaTouch (1),还有一个自定义本机(iOS)插件,用于解压缩Documents文件夹中的文件。该插件没有自己的GUI。
我们希望通过更新Sencha应用程序中的进度条(或简单的对话框)来显示解压缩操作过程中的进度。我们在本机插件中实现了一个更新函数,它使用"writeJavascript“方法从本机代码中调用Javascript代码。
调用该功能可以正常工作,但实际上不会显示我们在Sencha UI中所做的GUI更新,也不会显示调试日志语句。只有当我们在代码之间添加一个Javascript警告框时,我们才能观察到Sencha更新得到了处理,并且UI中发生了一些变化。感觉好像Sencha做的所有事情都是异步的,代码被以某种方式阻塞了。
我们遗漏了什么?
发布于 2012-07-25 23:33:14
这是一个典型的长时间运行的操作阻塞UI线程的例子。我猜软件开发中的事情永远不会改变。
基本问题是,如果您从HTML应用程序调用Phonegap插件,则Phonegap应用程序的图形线程(只有一个线程)会被阻塞。解决方案很简单:尽快从你的插件返回。
对于长时间运行的操作,这意味着在单独的线程中启动它们。正如another Stackoverflow answer所演示的那样,iOS上的一个非常优雅的机制是使用中央调度中心来实现这一点。
在dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ });块中执行长时间运行的操作,然后使用writeJavascript将更新发送回嵌套的dispatch_async( dispatch_get_main_queue(), ^{ });块中的Phonegap UI。
https://stackoverflow.com/questions/11610330
复制相似问题