Calling RESTful web service on Android by AsyncTask

在Google搜尋"REST" & "Android"的介接方式不外乎是下面這篇文章的做法

Article : Android and REST
Link : http://www.majidkhosravi.com/android-rest/

不知為何照做都沒錯,實際運行時就是接不到RESTful web service(以下簡稱REST)。無奈問了同事也是類似的方式,頂多加了延遲的秒數,讓Android的執行緒可以等待REST  response而不會timeout,後來才發現是Android 3以上就不支援Android and REST作法,正確且符合Android多執行緒宗旨的做法應該是改用AnsyncTask

那又為什麼同事的可以,我的Android Application Project卻不行呢?!
因為我手癢把android:minSdkVersion調到超高,而同事的minSdkVersion向下支援到2.3所以可以運行無誤(菸)

以下來說明AnsyncTask如何實作

●  在\AndroidManifest.xml加權限
< uses-permission android:name="android.permission.INTERNET">

●  src按右鍵→New→Class
替Class取個名稱(Name),Package則選擇當下Project對應的Package Name


●  選擇Superclass
在前一畫面的Superclass點選Browser..按鈕,開啟Superclass Selection視窗

●  搜尋AsyncTask
在Choose Type的input textbox輸入AsyncTask,選擇android.jar提供的AsyncTask

●  產生Rest.java檔案
可以從檔案中觀察此class已經繼承AsyncTask(extends AsyncTask)

●  實作產生Rest.java檔案
定義Params、Progress、Result的型別,定義如下
Params:呼叫這支class時傳入的值
Progress:這支class運作時的進度
Result:class運作後產生的資料

Rest.java我希望設計成User傳入一個String類型的URL,回傳HttpEntity類型的資料,至於描述執行進度的Progress則不需要回傳任何值。
所以這三個重要的參數是這樣設計的
Params:String類型的URL
Progress:不需要執行進度
Result:HttpEntity類型的資料
所以最後的樣子是AsyncTask< String, Void, HttpEntity> 

利用Eclipse提供的quick fixes快速實作介面

將介接REST的程式碼撰寫於quick fixes產生的doInBackground

●  在Activity呼叫
最後這樣呼叫就好


3 則留言:

kolen 提到...

張正妹,真是太強大了,解說的真詳細。

piggy 提到...

@kolen:謝謝指教XD 但是這個方法不好,要改用IntentService才對

kolen 提到...

正妹不發一篇教學文怎麼可以呢,期待。