Foursquare 原始碼研究之---------使用者登入

derekzhan發表於2010-12-03

   最近學習android,無意間看到Foursquare專案,於是下載下來看看了原始碼,看完後避免忘記,故寫下此文.

當我們拿到一個android專案,首先有機會最好是執行看看效果和Debug專案.這樣有個感官的認識,.我執行後的結果:

<!--StartFragment -->

 

注意:在debug的時候需要開啟fanqiang軟體,否則會報一個"java.net.UnknownHostException: Host is unresolved: api.foursquare.com:443" 錯誤. 還需要重啟模擬器. 切記.

一. 首先看看登入.

由於登入比較簡單,一筆帶過.

開啟Mainifest.xml檔案找到

<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

 


 這應該就是程式的入口.當然在他的外面還有application標籤.先不管application標籤,找到name=".MainActivity",然後可以順勢找到MainActivity.java檔案.找到onCreate方法.在onCreate方法中呼叫了redirectToLoginActivity().此方法重定向到LoginActivity.java,開啟此類會發現很簡單. 主要有2個EditText.2個button,一個是log-in,另一個是signin.

他們分別對應不同的listener. 註冊按鈕開啟瀏覽器註冊

startActivity(new Intent( Intent.ACTION_VIEW, Uri.parse(Foursquare.FOURSQUARE_MOBILE_SIGNUP)));

 


看上面的程式碼,不多說,主要看登入,

 

 

mLoginTask = new LoginTask().execute();

看到上面這句話了吧,啟動一個新的Task來提交請求,因為登入是把使用者名稱和密碼通過http協議傳輸到server進行校驗,是一個比較費時的操作,為了不讓UI僵死. 繼續看LoginTask類,他是繼承了AsyncTask類, 為什麼不採用Handler+Thread呢?要用AsyncTask呢? 因為前者跑起來後就無法管理,後者是可控的 具體請參考(http://blog.163.com/android_zhouwei/blog/static/1712422672010818105241892/), 繼續看程式碼.主要看LoginTask,有如下程式碼

boolean loggedIn = Preferences.loginUser(foursquare, phoneNumber, password, location, editor)

 


 此句的主要作用是用phoneNumber和password進行setCredentials.認證.foursquare中採用的Digest 認證,此種方式的認證,可以從 mHttpClient.getCredentialsProvider().setCredentials(mAuthScope, new UsernamePasswordCredentials(phone, password));


 程式碼中看出來,如對認證不瞭解請參考

(http://www.cnblogs.com/huqingyu/archive/2008/02/17/1071649.html) 有詳細的介紹.

認證完之後是把user資訊儲存在SharedPreferences中--storeLoginAndPassword(editor, login, password); 之後呼叫User user = foursquare.user(null, false, false, false, location); 傳送http請求,返回一個User物件,User中包含很多的屬性.然後儲存此user物件到SharedPreferences中.

從下圖可以看出user方法的呼叫框架.

<!--StartFragment -->
<!--StartFragment -->
如何返回一個Exception:"com.joelapenna.foursquare.error.FoursquareCredentialsException: HTTP/1.1 401 Unauthorized",表示使用者名稱和密碼錯誤.
如果使用者名稱和密碼都正確則還要儲存storeUser(editor, user);物件到sharedPreferences中.以便下次不用輸入直接進入. 接下來再onPostExecute方法中處理返回的Result.  今天寫到這裡該下班了.呵呵....

相關文章