最近有興趣瞭解一下Mono for Andriod,也就是使用.NET平臺來開發Andriod程序。Mono for Android API 幾乎映射標準的Andriod API.例如,兩邊API幾乎全部相同的類、方法和字段都相同。主要區別之一,就是Mono for Android使用屬性和委託在Java中不存在。我喜歡緊密相關的兩個api,由於這使它容易地在它們之間來回切換,並使用已存在標準Android API文檔。我可以成功完成個人項目使用Android,但仍有幾個困難....如下列出了關於Mono for Android的利弊:
php
優點:html
1. 平臺間共享代碼。若是配合使用Mono Touch API與Windows Phone API,您可能重用業務邏輯代碼爲iPhone和Windows Phone平臺所用。這是可能的,由於一切均可以進行使用單一的編碼,常見的編程語言而不是3種不一樣的編程語言。請注意,這雖然只適用於業務邏輯代碼;而每一個平臺的呈現代碼將由於不一樣平臺APIs的有所差別。在我看來重用代碼的能力是使用Mono fo Android的最佳優點。android
2. 使用你已有的.NET技能。若是你在團隊中比較熟悉.net平臺而不是Java平臺,那麼用Mono for Android比較合適。可是,我認爲這個優點已經是有所減小的事實,C#和Java是如此類似。有可能在使用Mono Touch,由於這消除了須要學習的Objective- C構成一個學習曲線,因此比有Java更大的優點。編程
劣勢:c#
1. 性能問題。例如垃圾回收,Mono for Android 聲稱支持垃圾回收,但也有須要注意的一些嚴重限制。"GC不完整視圖的進程,可能沒法運行在內存不足時,因爲GC不知道內存不足。"由於這一般須要手動,每當建立一個activity運行垃圾回收或銷燬,以釋放未使用的內存。不然,可能致使內存不足的異常。 我本身也不止一次碰到了這個問題,不得不使用替代方法來解決問題。 api
關於內存管理:
許多Mono for Android被分配對象爲包裝Java對象作爲它們的表明。 這時會發生什麼:每次你分配一個包裝過類型相對應Java類型,就建立兩個對象:
1). Java對象在Java堆中
2). Mono代理對象在Mono堆中
Mono for Android不能確保這兩個對象相互引用後長時間存活。那就是,Mono的垃圾回收引用一個對象,Java端的對象將一直活着,反之亦然。這個代理對象的建立mandroid.exe是工具編譯時完成。 然而,GC是懶惰的,按需運行的集合,而不是簡單地對象超出範圍時候。 那麼這意味着跨虛擬機的垃圾至少比通常更多,這是不可避免的。因此,爲了臨時使用時分配一個大數字對象,顯示釋放那些對象所需的資源是寶貴的。約定的方法使用using關鍵字來new一個object,使用using子句來隱式釋放目標的new object是有必要的。釋放Mono端的包裝的Java-VM收集的對象,從而來防止太多的臨時對象關聯在一塊兒很長時間。編程語言
去官方網站了解更多關於Mono for Android的垃圾回收。ide
(本做者:Xamarin團隊 對內存資源管理進行了優化:詳見:工具
http://developer.xamarin.com/guides/cross-platform/deployment,_testing,_and_metrics/memory_perf_best_practices/post
)
2. 第三方JAR Libraries - Mono for Android爲Android 4.2版本推出綁定任意JAR文件的支持。JAR綁定項目是一個蠻好的概念,但不幸的是這是不可靠的。對於簡單JAR files可行,但每每不支持在更復雜的Java庫的JAR文件。Xamarin提供一些關於如何排除綁定錯誤jar的文檔,但它並不老是幫助我。在將來版本也許這項功能將改善,但目前其難以使用,缺少文檔,還有幾個著名的bugs。
3.Bugs-- 有大量的bug在Mono for Android。嗯,也許重要的是太強的一個詞,但確定的更加穩定的需使用Java相對於Mono for Android。 我碰見的最嚴重的兩個bug有:日期時間。如今返回錯誤的UTC時區時間,並使用SSL與WebClient時會致使異常。
愈來愈多的趨勢是使用標準的Android和Java API來開發Android應用,而不是使用c#和Mono Android API。這麼說是由於,第一,Java有較好的開發社區支持,第二,使用Java可能會致使問題比較少。然而,可以共享相同的代碼在Android,iPhone,而Windows Phone等平臺是吸引人的,因此某些狀況下須要權衡。
做者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。
該文章也同時發佈在個人獨立博客中-Petter Liu Blog。