最近学习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 -->