Email me: jollen # jollen.org

more: Jollen 的 Embedded Linux 教育訓練

« April 2011 | (回到Blog入口) | June 2011 »

May 2011 歸檔

May 1, 2011

Jollen 的 Android Leak 開發解密, #3: Don't Access the Android UI toolkit at Worker Threads

這是 Android 官方「Dev Guide」裡提到的重要級觀念,但經常被忽略,因此在這裡做個簡單的說明。

許多 Android 應用程式經常發生「undefined」與「unexpected」的錯誤,很多錯誤的起因都是違反了這個觀念。在 Android Dev Guide 裡提到,每一個 Android process 都有一個「UI thread」負責處理 UI 事件,為了避免 ANR,應用程式開發者應該建立 Java thread 來執行像是 long operation 等的工作,由應用程式自行產生的 thread,稱為「worker thread」。Worker thread 有時也稱為 secondary thread 或 child thread。但問題發生了,一些應用程式在 woker thread 裡操作 Android UI toolkit。

所謂的 Android UI tookit 就是 android.widget 與 android.view 二個 package。以下是 Dev Guide 上的範例片斷:

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
            mImageView.setImageBitmap(b);
        }
    }).start();
}
(Source: Android Dev Guide)

範例中的 mImageView 物件就是 android.widget.ImageView。這是不對的寫法。根據 Dev Guide 上的說明,採用以下的方式可修正此問題:

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)

使用 View.post() 將 'Runnable' 放到 message queue 裡即可解決此問題。Message queue 裡的 'Runnable' 會在 UI thread 上執行。

Android Leak 開發解密系列,整理自 Jollen 過去在 Android 領域的經驗,以「Do & Don't Do」形式分享一些重要但常被略的開發觀念。轉載請全文引用,並註明出處 (Jollen's Blog, http://www.jollen.org/blog),謝謝您對數位內容著作權的支持。

May 29, 2011

Jollen 的 Android Leak 開發解密, #4: Don't Create Unnecessary Objects in Main Thread

在 Dev Guide 裡還有另外一個重要的觀念:避免產生不必要的物件。這個觀念真的很重要,如果要讓程式的效能更好,不斷在 Main Thread 裡產生物件是 bad idea。原因是 Garbage Collection。

Android 的 Dalvik 虛擬機在初始化時,會建立 Main Thread。Main Thread 負責眾多任務,其中之一是 Garbage Collection,也就是負責做資源回收,把用不到的物件回收再利用。如果我們不斷在 Main Thread 裡產生物件,Main Thread 很可能忙著幫我們收拾垃圾,當 Main Thread 花費太多心思幫我們撿垃圾,處理其它工作的效率就會變差,例如:UI 事件處理。

所以,這告訴我們一個重要的觀念:「不要產生不必要的物件」,難怪 Dev Guide 在講「Designing for Performance」時,把這個觀念放在首位。有些 Class 在設計時,提供了多種 instantiate(實例化)方法,以 android.os.Message 為例,我們可以這樣做:

Message msg = new Message();

也可以這樣做:

Message msg = Message.obtain();

透過 Message.obtain() 做實例化,可以重用先前的 Message object:

Return a new Message instance from the global pool. Allows us to avoid allocating new objects in many cases. (--Android SDK Reference)

如果要在 Main Thread 裡以 Message 方式處理「按鍵事件」,較好的寫法就是:

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		...
		mHandler.sendMessage(Message.obtain()); // 可避免產生不必要的物件
		...
	}
要避免,也不要在 Main Thread 裡產生不必要的物件。

Android Leak 開發解密系列,整理自 Jollen 過去在 Android 領域的經驗,以「Do & Don't Do」形式分享一些重要但常被略的開發觀念。轉載請全文引用,並註明出處 (Jollen's Blog, http://www.jollen.org/blog),謝謝您對數位內容著作權的支持。

May 30, 2011

台灣,軟體意識抬頭了!Android 大功臣與 3個 M 型現象

文/Jollen Chen(原文刊載於零組件雜誌 2011 年 5 月號)

新一波的產業核心競爭力,有一個最簡單的答案,那就是「軟體」。軟體不只是「程式碼」與「技術」的代名詞,而是代表了整個新時代,從產品面來看,就是「創意」、「社群」與「網路」。「軟體提升附加價值」、「軟體才是產品的核心」等口號,不再是「下一波」產業的趨勢,而是「現在進行式」了。

近期台灣許多大廠,不約而同,大舉招募「軟體工程師」,說明軟體反客為主,將在「硬體成本競爭」時代自創格局。從「人力資源」的角度來看,經營教育訓練市場多年,最近也發現到許多過去沒有的有趣現象:人才移動很M型,自有開發能力很M型,建立軟體能力意識很M型。

第一、要人、找人 vs 找不到人。這是過去幾年沒有過的現象,可以說是「幾乎所有」的科技廠,都在設法招募優秀的軟體人員,以提升公司的軟體能力。軟體相關的招募需求旺盛,前所未見。從目前開放出來的軟體職務,以及招募現況來看,呈現相當兩極的現象。頂尖人才或即戰力,幾乎都往少數科技大廠移動,更多廠商開放出來的職務則是乏人問津,顯見「軟體」的新時代,公司的號召力、形象、品牌、活力與產品等,才是吸引人才的關鍵。

第二、委外、再委外 vs 自有開發能力。因為Android前景大好,有不少軟體外包的案件,為數可觀;廠商也大舉採取委外方式,「設法解決一些技術問題」。不過,有一點可以讓我們思考的現象是,有軟體開發「丟包」需求的,幾乎都是中小型廠商,甚至是一些二線品牌,從另一個角度來看,我們應該是設法提升自我的軟體開發能量,建立自已的核心價值,委外不再是面對軟體時代的良好解決方案。有能力自製軟體的,大多數都是大型產品公司,或是小型新創軟體公司。台灣品牌找深圳山寨做「代工」,就是很好的例子。

第三、內部軟體人才的培養。從事教育訓練多年,很明顯感受到,這一年公司對內部軟體人員養成的重視。不單單只是從這一年接受內訓委託案的數量來看,更可以從廠商心態轉變來看。很令人感到興奮的是,廠商不但有強烈的「建立軟體團隊」意識,更願意投入資源,培養內部團隊。大部份具規範的廠商,積極採取內部培養的方式建立軟體能力,這與中小型廠商的「委外」做法,大相逕庭。現在的現象是,有人積極培養軟體能力,也有人認為仍必須做成本競爭,軟體只是附件。

最後,這是個人看法。不過是招募、委外或內部養成,都能有效地解決「軟體開發面」的問題,但就像我們知道的,軟體是「網路」、「應用」、「創意」、「社群」、「產品」等多面向的技術,除了開發技術外,產品規劃也是很重要的能力。台灣一些品牌廠的成功經驗,是值得我們借鏡與學習的。從這個角度來看,提升產品經理人對軟體的認知,才能擺脫「硬體思惟」,擺脫「成本、規格與 BOM」的硬體勝利方程式 (Hardware);有了軟體,應該來做真正的「產品 (Product)」。

關於 May 2011

此頁面包含了在May 2011發表於Jollen's Blog的所有日記,它們從老到新列出。

前一個存檔 April 2011

後一個存檔 June 2011

更多信息可在 主索引 頁和 歸檔 頁看到。

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org