設計 Plurk 行動軟體的困境 (?)

希望只是我對 API 的不熟悉而已 ....

之前我因為想練習寫寫 Android 上的應用程式,所以寫了一個非官方的 Plurk 的 client 軟體 -- Pluroid,雖然寫得不是很好(而且又有 HTC 內建的 plurk 軟體夾擊),不過有些心得想跟大家分享一下。

首先,不管你用什麼方法去「撈」出 plurk 的資料,一定會發現每一筆 plurk 都會有兩種資料:content_rawcontent,這兩者的差別顧名思義:

content_raw 相當於你在輸入時的原始文字,粗斜體、圖片、連結或是表情符號等等都不會替換成對應顯示方式;而 content 則是經由 plurk 處理過的資料,會將你的輸入轉化成 HTML 的格式以便瀏覽器輸出

為了比較這兩者的差別,所謂有圖有真相,我們先來看 HTC 內建的 plurk 軟體,它是採用 content_raw 作為訊息的資料:

再來比較一下小弟的拙作(UI 等級實在差太多了 ...Orz):

而我是使用 content 作為訊息的資料,所以才不會出現「連結 (標題)」這樣的內容。

問題就在這裡了,以 HTC Plurk 來說,在畫面上它只需要使用一個 TextView 元件(搭配 autoLink 屬性)就可以顯示完成,而我為了要顯示HTML字串,先選用了 WebView 元件來顯示,但這個作法並不理想,因為 WebView 的繪製速度太慢了,元件因為無法事先算好它的高度,所以畫面就得一直閃皪以「展開」這些 WebView 元件,而且就算是閃完了,在捲動的過程中,也可以觀察到記憶體不斷哀嚎的感覺(看 log 是拼命作了 GC),使用體驗可以說是相當地糟糕。

後來經過高人指點,要顯示 HTML 字串還是可以使用 TextView 元件,但資料內容就得用 android.text.HtmlfromHtml 來格式化成 TextView 元件能接受的 android.text.Spanned 物件來顯示。不過事情當然沒那麼快樂,如果只是單單用這個方式的話,原本訊息中的所有圖片都不會顯示(雖然這樣就快很多了 XD)

於是我仔細地研究了一下 android.text.Html.fromHtml() 這個方法,發現它可以帶一個 ImageGetter 的 handler 去處理抓圖片的動作,但高興不到幾秒鐘,就發現它根據 URL 去抓圖片回來的動作是同步的,也就是說:

如果圖片還沒抓完,那 fromHtml 的動作就不會結束 ....

所以,這就是 Pluroid 會比較慢的原因之一吧...在 android 上要顯示多個 HTML 字串及豐富的內容,真是太辛苦了....Orz

不過,從 zonble 的「Shit happends, always」這篇文章看起來,要在 iPhone 上面顯示 HTML 字串好像也不是很快樂的樣子...(iPhone 上的免費 plurk 軟體也是用 content_raw 作為訊息的資料顯示)

難道這就是在行動裝置上設計 plurk 軟體的困境(之一)嗎?不知道 S60 的 widget 表現得如何 😛

  • danix

    學長我覺得 HTC Peep for Plurk 速度快的秘密在
    使用獨立的 API (應該是花錢買得)和 gzip 最佳化
    用相同技巧,可以在 iPhone 作到比 Peep 更好的 Experience
    但使用 HTC API Key 所以程式不能放出來

  • 我只能說…問題真的不是在 API ….

  • 標題也許可以改為『設計 Ajax 行動軟體的困境』
    這可能不是 Plurk 單一的問題

  • jln (:D)

    “如果圖片還沒抓完,那 fromHtml 的動作就不會結束 ….” <—造假造假, 讓他以為抓完了再偷偷抓完重畫… XD (Just a hint :P)

  • @jln:
    沒想到我為人這麼正直還必須要這樣地偷吃步 XD
    受教了,我研究看看 XD

  • @jln:

    造假資料目的假如只是要預先替圖片『訂位』
    那麼何不直接用 DIV, CSS 指定好尺寸?

  • JanYeh

    用multithread來解. 或者改用TextView跟ContentRaw讓使用者先看到內容,詳細頁再進去用webView

  • jln (:D)

    @ericsk 那可能還是正規解法… XD 至少確定這樣是OK, 只是不是那麼好tune就是了…
    @Ticore TextView won’t handle that!

  • 加油,在iphone上現有Plurk軟體真的不好用,穩定性又差,看看你能不能寫一個好一點的來解救大家,我會幫你推的^^

  • HTC Peep 是買 Twidroid 來改的. Plurk API 就不清楚了.
    HTC 客製化了自己的 ListView 元件, 加在Framework 中, 所以寫 AP 的人用起來就快活多了~
    個人開發者就只能自生自滅了…..