0

我们有一个 Phonegap/Cordova (1.6.0) 应用程序,它的 UI 使用 SenchaTouch (1) 和一个自定义本机 (iOS) 插件,用于解压缩 Documents 文件夹中的文件。该插件没有自己的 GUI。

我们希望通过更新 Sencha 应用程序中的进度条(或简单的对话框)来显示解压缩操作期间的进度。我们在原生插件中实现了一个更新函数,它使用“writeJavascript”方法从原生代码调用 Javascript 代码。

调用该功能有效,但我们在 Sencha UI 中所做的 GUI 更新都没有实际显示,调试日志语句也没有显示。只有当我们在代码之间添加一个 Javascript 警告框时,我们才能观察到 Sencha 更新已被处理并且 UI 中的某些内容发生了变化。感觉好像 Sencha 异步执行所有操作,并且代码以某种方式被阻塞。

我们缺少什么?

4

1 回答 1

0

这是一个长时间运行的操作阻塞 UI 线程的经典示例。我想在软件开发中事情永远不会改变。

基本问题是,如果您从 HTML 应用程序调用 Phonegap 插件,Phonegap 应用程序的图形线程(并且只有一个线程)会被阻塞。解决方案很简单:尽快从插件中返回。

对于长时间运行的操作,这意味着在单独的线程中启动它们。iOS 上的一个非常优雅的机制是为此使用 Grand Central Dispatch,正如另一个 Stackoverflow 答案所示。

您在块中执行长时间运行的操作,dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ });然后使用 .将更新发送回嵌套dispatch_async( dispatch_get_main_queue(), ^{ });块中的 Phonegap UI writeJavascript

于 2012-07-25T15:33:14.387 回答