顯示具有 HttpURLConnection 標籤的文章。 顯示所有文章
顯示具有 HttpURLConnection 標籤的文章。 顯示所有文章

2011年3月4日 星期五

讓癮科技 Android 應用登上榜首的秘密

How do I make my Engadget(Chinese Version) app to become the most popular app?

經過將近一個月的測試,2011/2/6 首次發行 癮科技 Android app 到 Android Market 上。六天後的今天 (2011/3/3),這個應用很快地爬到「新聞與雜誌」類別排行榜中的第一名位置,同時也是所有應用程式排行榜的第四名。在目前 Android Market 已有 16 萬個 Android 應用 一起激烈競爭的情況下,新的應用能這麼快登上排行榜,真的是一件很不容易的事。這中間,癮科技寫的「不要再叫我們蘋科技!癮科技新聞訂閱程式也有Android版了」這篇介紹文,當然有很大的幫助。

除此之外,到底有什麼樣的秘訣,才能讓我的應用程式登上排行榜呢?這是我最常被兩岸開發者問到的問題之一。

要讓應用程式登上排行榜,可以分成非技術面與技術面兩個面向來談。非技術的部份,我早在 2009/10 一場研討會的「發現 Android 熱門應用程式的秘密」的講座中,分享給大家。只不過這場演講主要的對象是對岸的開發者,對於台灣的開發者,只好等下次有人邀請我演講時,我再分享給大家。

技術面的部份,最主要的除了不能讓你的應用程式輕易當機之外,當然就是要讓使用者用起來很順暢才行。「使用的很順暢」這句話講起來很輕鬆,不過卻是得花最多時間與人力去調整各項細節,才能做到的地方。

這些細節,使用者當然不會注意到,也不會告訴你。就看你是否知道使用者的痛苦(需求),以及你如何深入了解這些痛苦的解決方法是甚麼。在這裡我就拿我最近開發的癮科技 app 來當案例。說明我們在技術的層面上,做了哪些努力。

第一:這不是一個單純的 RSS reader。一般這樣的應用程式開發者,可能都會以 RSS reader 的架構來開發這樣的應用。為了讓這個應用能跑得更順,我們決定走不一樣的路,在 server 端提供專屬的 APIs,在手機端也做了一些一般 RSS reader 做不到的功能。例如,你可以往下一直看過去的 N 篇文章。

第二:所有抓下來的文章與圖片,都存到 SD 卡上,以節省手機儲存空間的使用。多數的手機,內部儲存空間都是有限的,這造成使用者常要刪除舊的應用,以增加多餘的空間來裝新應用。這從我的 App 2 SD 與 aCCleaner 應用受歡迎的程度,就可以了解使用者在這方面的需求很大。如果你的應用佔的空間太大,在這點就吃虧很多。看到這,你可能會說這有什麼,大家都有這功能。不對,細節就在這裡。如果你有使用其他的新聞閱讀軟體,就可以觀察到他還是吃了不少 data/cache 空間。這原因就在你應用所建立的 Sqlite database 以及 WebView 所建立的 database/cache 都還是存在內部儲存空間。要將這些完全移到 SD 卡上,這可花了我好幾天追蹤原始碼,才知道要怎麼解決這個問題。目前,我只將 preferences 存在內部儲存空間中,其他都移到 SD 卡上。

第三:自動縮放文章中的文字與圖片大小。水平捲動對手機使用者來說,是一件很痛苦的事,這是千萬要避免發生的事。自動縮圖片,就是要解這問題。另外,多數的新聞閱讀應用的字體大小都太小了,行距也不對。這對要長時間閱讀文章的人,是一種折磨。你現在看到文章中的預設字體大小與行距,可是我們花了好多時間才調校出來的。你說,這不又是一個要在細節下功夫的地方?

第四:離線也能閱讀文章。離線閱讀的功能,對於這樣的新聞應用是一個很重要的功能,這樣使用者才真的能隨時隨地都可以看文章。文章與圖片都存到 SD 卡上,不是就能實現這個功能了嗎?不對,這只做了一半。另外一半就是你還要實現自動預下載文章的功能,有了這功能使用者才能隨時隨地有「新」文章可看。寫網路程式可算是手機程式中一件非常有挑戰的事,因為手機的 CPU 會進入 sleep 模式,網路可能隨時會中斷,速度可能掉到 GPRS 的速度等等各式各樣的問題都會出現。這些種種你必須要面對的問題,你都得處理,才能讓你的應用跑得很 solid。

雖然我們做了這麼多的努力,這個應用還有一些沒做好的部分。我們還會繼續在這個應用中奮戰好一段時間,在接下來的新版本中,我們會陸續解決這些問題,敬請期待!


繼續閱讀全文...

2008年9月15日 星期一

Android 上的 HTTP 服務相關函式 (I)

The introduction of HTTP connection APIs on Android platform - Part I.

在 這篇 中,我提過如何利用 java.net.* package 中的 HttpURLConnection class 來使用 HTTP 這個服務。

熟悉 Java 的你,對這個類別的用法,應該不陌生。就以 GET 的用法來說,最簡單的用法如下:

不過,當你處在 proxy 之後,或是要處理 redirect 之類的需求時,用這個 class ,就顯得有點辛苦。

所幸,在 Android 中,已經將 Apache 的 HttpClient 這個模組整合進來。有了這個模組,要寫 HTTP 相關程式,你會輕鬆許多。

在這裡你要注意的是,在 Android 中,所整合的 HttpClient,並不是一般大家常見的 Jakarta Commons HttpClient 3.x (也就是 org.apache.commons.httpclient.* package)。而是,目前最新的 HttpClient 4.0 (org.apache.http.*)。

關於這個最新的 HttpClient 4.0,在原網頁上的說明也還不是很多。下次,我會就這方面,分享一下我的實際使用經驗。


繼續閱讀全文...

2008年7月28日 星期一

在 Android 上利用 Google APIs 實現 Google Suggestion 功能

Using Google APIs to implement Google Suggest functions on Android platform.

這篇是屬於偏向教學性質的文章。在這篇,我將示範的是,如何利用 Google APIs,做出和 Google Suggest 一樣,會依照你輸入的部份字元,自動列出建議關鍵字的程式。這個程式的執行畫面,就像下面這樣。

在 Google 提供的眾多服務中,Google Suggest 是我自己很常用的功能之一,他可以幫我列出那些關鍵字是最常被使用的。如果你還沒用過,他的網址在這:http://www.google.com/webhp?complete=1&hl=zh-tw。你可以自己上去試用看看。

在開始介紹要如何寫出這樣一個程式之前,你會需要用到下面這些背景知識,我建議你要先讀過這些文章:

除了這些,在這篇教學中,你將會學到:

  • 如何用 HttpURLConnection 抓取網路服務所提供的資料。
  • 如何用 Handler 處理 Non-UI thread 的 UI 更新要求。
  • 如何用 Html.fromHtml() 在 TextView 上顯示簡單的 HTML 格式。

如何取得 Google Suggest 的建議關鍵字資料?

首先,要先知道如何取得這 Google Suggest 的建議關鍵字資料。要取得這建議關鍵字,你可以透過這個 URL,http://www.google.com/complete/search?xml=true&q=你的部份關鍵字字元。由於我們希望他傳回的是 XML 格式,因此在這個 URL 上要加上 xml=true這個查詢參數。例如 http://www.google.com/complete/search?xml=true&q=andr 這個 URL,所傳回的結果如下:

看到沒,這 suggestion data="android" 內的 data 資料,就是我們要的建議關鍵字。而 num_queries int="22500000" 內的 int 數目,則代表有多少和這個關鍵字相關的結果。

如何用 HttpURLConnection 抓取網路服務所提供的資料?

關於這 XML 格式的結果,待會我再說明,如何利用 DOM API,將我們要的資料抽取出來。我先說如何用 HttpURLConnection 去抓取這資料。先看下面這個程式片段:

在第 10~11 行中,我們先利用 URLEncoder.encode() 產生包含查詢字串的完整 URL 地址,並產生個 URL 物件。在 14 行中,用 URL.openConnection(),打開一個 HttpURLConnection 連結物件。有了這個物件,接著的 getResponseCode(),就會實際連到你所指定的網址,並將你所指定的頁面資料傳回來。這傳回的資料,就在第 19 行 http.getInputStream() 所傳回的 InputStream 內。最後的第 21~24 行,就是在將這傳回的 XML 資料,轉成 Document 物件。之後,我們就可以用 DOM APIs,抽出我們要的資料。

如何解析 XML 資料並轉成 DOM?

底下的程式片段說明如何用 DOM APIs,抽出我們要的建議關鍵字及其結果數量。

所有抽出來的建議關鍵字其數量值,都放在 alSuggWord 和 alSuggVal 這兩個 ArrayList 中。底下的程式,則是簡單地依照數量值重新排序最後的結果。我們要的,當然是數量最多的排第一。

如何客製化 AutoCompleteTextView 中的 Filter 功能?

我們知道,每當你在 AutoCompleteTextView 中輸入一個字元,他都會呼叫 Filter 類別的 performFiltering() 函式,讓你自己過濾所要顯示的結果。由於我們希望所有的結果,都是透過 Google Suggest API 所要回來的。因此我們在這個函式中,主要就是呼叫前面介紹過的 GoogleSuggestiong.Get() 取得所有的建議關鍵字。

如何用 Handler 處理 Non-UI thread 的 UI 更新要求?

在大多數的 single thread GUI framework 上,都會規定你不能在這個寶貴的 UI thread 中,花太長的時間來執行某段程式處理,Android 也是如此。如果你真的違反這個規定,那你的使用者就會看見 ANR (Application is Not Responding) 這個警告訊息。

這個的解法就是將原先要花許多時間處理的程式移到另一個 non-UI thread 上。

不過,另外一個問題來了。在 Android 中,只有 UI thread 可以呼叫 UI 物件所提供的函式。例如,在這個範例中,在取得建議關鍵字的過程中,我們都會呼叫 _UpdateStatus(),顯示目前的進度狀態。不過由於 Filter.performFiltering() 在 Android 的設計上,他是被另一個 Non-UI thread 所呼叫的。因此在 _UpdateStatus() 中,你可不可以直接呼叫 TextView 的 setText() 函式。我的解法就是在 Non-UI thread 中,透過 Handler,傳送一個 message 到 UI thread 的 handler 處理函式,讓 UI thread 來處理 View 類別的相關顯示工作。底下是關於這個處理的程式片段:

如何用 Html.fromHtml() 在 TextView 上顯示簡單的 HTML 格式?

TextView 其實提供了許多好用的功能,其中最棒的是,他還允許你顯示簡單的 HTML 格式。你只要傳個 Spanned 物件給 setText() 即可。在 Android 上,有許多 APIs 都可以幫助你產生,Spanned 物件,不過我最常用的就是 Html.fromHtml(),原因就是他簡單好用。看了底下的程式片段,你應該就會用了。

最後,底下是關於 sugg.xml 檔的內容。

這個範例程式,只做到列出候選的建議關鍵字讓你選。至於 action 函式,就請你發揮自己的創意繼續完成他囉。


繼續閱讀全文...