Foursquare 源码研究之---------用户登录

来源:互联网 发布:公共卫生学mac 编辑:程序博客网 时间:2024/05/22 09:46

原文地址:http://derekzhan.iteye.com/blog/832910

  最近学习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.  今天写到这里该下班了.呵呵....