我正在学习 Android/iPhone 开发课程,我们花了 8 周时间学习 Titanium(不是全日制)(版本是 Titanium 1.4.2,时间大约是 2010 年 11 月)。这是我的经验。
iPhone Android 双重定位
尽管 API 指南声称该功能适用于 Android 和 iPhone,但事实并非如此。许多东西根本无法在其中一个平台上运行。有些事情的工作方式不同。
班上很多人都做过 iPhone 应用程序,如果不进行重大改写,他们就无法让它们在 Android 上运行。我开发了一个名为 Animap 的简单儿童应用程序(参见瑞典的 android market / Appstore)并开始在 Windows 下开发。一旦 Android 目标开始工作,我就在 OS X 上打开了该项目。它没有显示任何针对 iPhone 的构建内容,仅针对 Android。你需要在 OS X 下启动一个双目标项目。(好的,我将相关文件复制到一个新项目中)。下一个问题 - 动画在 iPhone 上不起作用(它们在 Android 上起作用)。滚动事件在 iPhone 上的工作方式不同。 (即在 Android 上,当用户停止滚动并从屏幕上松开手指时,您会收到 untouch 事件,这在 iPhone 上不会发生)。
由于在某处没有提到这一点,您基本上需要在第一个平台上进行试错编程,然后在另一个平台上进行。通过反复试验,我的意思是大约需要两天时间才能让像Animap这样简单的应用程序在另一个平台上运行。您还需要在您的代码中使用 if (android) then... 或 if(iphone)... ...
下载和设置
您必须按照信中的说明进行操作。
不要尝试使用 java 64 位。它不会编译 KitchenSink 1.4.0 演示应用程序。 (1.3 工作正常!)
您必须将文件直接放在 C 驱动器上,因为如果路径名过长,外部程序将无法接收所有命令行参数。 (不过对于小程序来说很好)
1/3 的时间,工具链只是停止,您必须再次按“启动”。然后它可能会工作......非常不可靠。
模拟器在启动时将找不到,然后您必须简单地使用 Ctrl+Alt+Delete 杀死 adb.exe 并重试。
网络连接
在 wifi 网络上,您有时会失去实时连接,并且 Titanium 会在您身上崩溃(编译/部署界面)
如果您没有有效的互联网连接,它将无法启动,因为它无法让您登录到他们的服务器。
API
与此相比,CSS、HTML 和 jQuery 轻而易举。 Titanium 类似于任何其他旧的 GUI API,您需要为每个按钮/字段/等设置一些属性。弄错字段很容易,记住所有需要设置的属性?你在正确的地方用大写字母拼写了吗? (因为这不会被编译器捕获,但如果您有幸测试该部分,则会被视为运行时错误)
在 Titanium 中,当您在控件顶部添加另一个视图或单击 GUI 中的其他位置时,事情就会中断。
文档
一些 API 页面带有 Android 符号,但在您尝试创建控件时只会返回 null。尽管有符号,但它们不仅在 Android 平台上可用。有时会提到 Android 不支持特定方法,但随后缺少整个 API。
厨房水槽
演示应用程序。我有没有提到如果你把它放在你的 Eclipse 项目文件夹中它不会编译,因为路径太长了?必须放在你的C盘根目录下。我目前使用符号链接(mklink /J ...)
未记录的方法
您必须适当地使用 label.setText('Hello World') 来更改可靠的标签,但这根本没有记录。
调试
Titanium.API.info('打印输出是调试的唯一方法');
编辑
这些 API 没有任何好的格式,因此您无法在 Eclipse 中通过帮助等获得普通的代码完成。 Aptana 请帮忙!
硬件
编译器/工具似乎不是多线程的,因此必须使用具有快速硬盘驱动器的快速计算机,因为您必须进行大量试验和错误。我有没有提到糟糕的文档?您必须尝试那里的所有内容,因为您无法信任它!
一些积极的事情
错误
-
Titanium 1.4 不是线程安全的。这意味着如果您使用线程(在 createWindow 调用中使用 url: 属性)并且程序像线程正在工作并来回发送带有数据的事件,您会遇到很多非常非常奇怪的东西 - 丢失处理程序,丢失windows,太多的事件,太少的事件等等等等。这都取决于时间,将代码行以不同的顺序放置可能会崩溃或修复您的应用程序。在另一个 file.js 中添加一个窗口会破坏您的 app.js 执行...这也会破坏 Titanium 中的内部数据结构,因为它们有时可以并行更新内部数据结构,用其他内容覆盖刚刚更改的值。
我在使用 Titanium 时遇到的大部分问题都来自于我的实时系统背景,例如 OSE,它支持数百个线程、事件和消息传递。这应该在 Titanium 1.4 中工作,但它根本不能可靠地做到这一点。
Javascript(对我来说是新的)在运行时错误时静默死掉。这也意味着小而常见的错误,例如拼写错误的变量名或读取空指针不会在应该崩溃的时候崩溃,因此您可以对其进行调试。相反,您的程序的某些部分会停止工作,例如事件处理程序,因为您放错了/输入了一个字符。
然后我们在 Titanium 中有更简单的错误,例如某些参数在函数中不起作用(至少在 Android 平台上很常见)。
试错调试周期速度
在多台计算机上运行 Titnium Developer 后,我注意到瓶颈是硬盘驱动器。笔记本电脑上的 SSD 驱动器使构建周期比 4200 rpm 驱动器快 3-5 倍。在台式机上,RAID 1(条带模式)下的双驱动器使构建速度比 CPU 速度稍快的单驱动器快 25%,而且它也击败了 SSD 驱动器的笔记本电脑。
总结
- 从这个线程中的 cmets 看来,对于像这样的工具可以交付应用程序的平台数量,似乎存在争议。 API 的数量似乎是关键卖点。
当您开始使用它时,它会非常闪耀。如果您查看打开的 bugtracker,您会发现 bug 的数量不断增加,速度快于已修复的 bug 的数量。这通常表明开发人员不断添加更多功能,而不是专注于减少错误数量。
作为一名试图为客户在多平台上交付相当简单的应用程序的顾问,我不确定这实际上是否比在两个平台上进行本机应用程序开发更快。这是因为当您加快速度时,您使用 Titanium 的速度很快,但突然您向下看,发现自己陷入了一个如此深的洞中,您不知道必须花费多少小时才能解决问题。您可以简单地不承诺特定期限/时间/成本的特定功能。
关于我自己:在 wxPython 中使用 Python 已经两年了。 (那个 GUI 是不一致的,但永远不会像这样中断。可能是我不了解 Javascript 和 Titanium 使用的线程模型,但根据他们的公开讨论论坛,我并不孤单,GUI 对象突然使用错误的上下文/不更新..???) 在此之前我有移动设备的 C 和 ASM 编程背景。
[编辑 - 添加了带有错误且不是线程安全的部分]
[编辑 - 现在已经使用了一个月+,主要是在 PC 上,但也有一些在 OS X 上。添加了 iPhone 和 Android 双目标。增加了 Trial and Error 调试周期速度。]