首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

新浪微博客户端开发之受权登录+获取微博列表

2013-10-10 
新浪微博客户端开发之授权登录+获取微博列表新浪微博客户端开发之授权登录获取微博列表闲篇:最近实在是乱

新浪微博客户端开发之授权登录+获取微博列表

新浪微博客户端开发之授权登录+获取微博列表
闲篇:最近实在是乱得不行,至于怎么乱我也不知该怎么说,那么久没发博客就证明了这点,一般如果小巫有做详尽的计划,并把时间投入到上面的话,我是可以用最短的时间里把新浪微博客户端给整出来的,但现在进度很慢,我越来越不像个称职的程序猿,因为现在的生活已经不再是代码,更多的是想多享受跟朋友们在一起的快乐。这些话也不多说了,关于这个项目,其实我也头痛了一整子,我很久之前就买了一本李宁的Android应用开发实战,里面很大篇幅就是介绍这个客户端的开发,因为一开始我是比较迷惑的,迷惑他到底有没有使用新浪开发平台提供的SDK,然而整个授权过程到获取微博的各种数据又是怎样的?我还在考虑我要做成一个怎样的,是否只是单纯的模仿呢?反正种种疑虑,一阵子找不到北了。后来我花时间研究了他的代码,慢慢的也找了了一些门道,明白了他从是怎么把整个客户端搭建起来的,他没有使用新浪给我们提供的SDK,而似乎是把SDK的实现给翻出来了,因为SDK仅仅提供了获取微博数据的封装,开发者就只需调用API,知道怎么传参数就行了,所以很多高手是不会直接使用新浪提供的Android SDK。要我从头到尾开发,把所有业务逻辑实现,我实在不行,所以会直接参考Android应用开发实战所提供的代码,把整个新浪微博客户端开发出来给大家看看,这也算是小巫的一个提升,与大家共同进步。

正篇:本篇博客呢,主要介绍如何进行授权认证,如何获取微博列表,因为代码比较多,我不会全部都能贴出来,整个客户端也没有开发完毕,我也是实现一个功能,然后整理博客发表出来,如果想要项目源码的,可以直接找我,我的QQ:659982592, 如果我在的话,我会尽快答复你的。先来看看本篇博客想要实现的效果图:新浪微博客户端开发之受权登录+获取微博列表新浪微博客户端开发之受权登录+获取微博列表新浪微博客户端开发之受权登录+获取微博列表新浪微博客户端开发之受权登录+获取微博列表


看到以上的效果,我想很多人都想知道是如何实现的,不急,我们慢慢来看,这个可不是能一口吃掉的螃蟹。
我先简单介绍一下以上效果图的业务流程,启动程序后,首先需要获取用户授权,假如已经授权过了,就不会出现提示用户输入登录的界面,授权成功后,直接获取微博数据,显示到微博列表当中。整个流程其实也蛮简单的,现在我们来看看代码。
/Wwj_sina_weibo/src/com/wwj/sina/weibo/WeiboMain.java
这个类用来切换底部标签的,比较高的版本已经不推荐用这种方法实现,不过没关系,反正高版本兼容低版本。
package com.wwj.sina.weibo.library;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;import org.json.JSONArray;import org.json.JSONObject;import android.util.Log;import com.wwj.sina.weibo.interfaces.WeiboObject;public class JSONAndObject {/** * 将一个对象转换为JSON格式的字符串,只转换public类型的变量 *  * @param obj * @return */public static String convertSingleObjectToJson(Object obj) {String json = null;if (obj == null) {return json;}Field[] fields = obj.getClass().getFields();json = "{";// 开始转换每一个public类型的变量for (int i = 0; i < fields.length; i++) {try {Field field = fields[i];if (field.getType() == String.class) {// 属性值为null, 用空字符串取代String temp = ((field.get(obj) == null) ? "" : String.valueOf(field.get(obj)));// 处理字符串中的双引号// JSON字符串中不能直接使用双引号temp = temp.replaceAll("\"", "\\\\\"");json += "\"" + field.getName() + "\":\"" + temp + "\"";}// long类型else if (field.getType() == long.class) {json += "\"" + field.getName() + "\":" + field.getLong(obj);}// int类型else if (field.getType() == int.class) {json += "\"" + field.getName() + "\":" + field.getInt(obj);}// boolean类型else if (field.getType() == boolean.class) {json += "\"" + field.getName() + "\":"+ field.getBoolean(obj);}// Object类型(WeiboObject类型)else {Object fieldObject = field.get(obj);if (fieldObject instanceof WeiboObject) {// 如果对象中含有对象类型的变量// 递归生成JSON字符串json += "\"" + field.getName() + "\":"+ convertSingleObjectToJson(fieldObject);} else {continue;}}if (i < fields.length - 1) {json += ",";}} catch (Exception e) {}}json += "}";return json;}/** * 将obj转换为JSON字符串,该字符串必须是一个对象 其中obj必须是一个List,而且JSON字符串必须包含一个propertyName * 制定的属性,属性值是JSON数组,该数组与obj指定的List对应 类似于hometimeline.json返回的JSON字符串的逆过程 *  * @param obj * @param propertyName * @return */public static String covertObjectToJson(Object obj, String propertyName) {String json = null;if (obj == null) {return json;}if (obj instanceof List) {List list = (List) obj;if (propertyName != null) {// 包含一个属性的对象,这个属性是对象数组json = "{\"" + propertyName + "\":[";} else {// 对象数组json = "[";}for (int i = 0; i < list.size(); i++) {Object item = list.get(i);json += convertSingleObjectToJson(item);if (i < list.size() - 1)json += ",";}if (propertyName != null) {json += "]}";} else {json = "]";}}return json;}/** * 将json字符串转换为List *  * @param c * @param json * @param propertyName *            这个参数用来制定属性的对象,而且这个属性值必须是一个数组 * @return */public static List convert(Class c, String json, String propertyName) {List objs = null;if (c == null || json == null)return objs;try {// 只使用public类型字段Field[] fields = c.getFields();if (fields != null) {String jsonStr = json;if (propertyName != null) {JSONObject jsonObject = new JSONObject(json);jsonStr = jsonObject.get(propertyName).toString();}JSONArray jsonArray = new JSONArray(jsonStr);objs = new ArrayList();for (int i = 0; i < jsonArray.length(); i++) {Object obj = c.newInstance();objs.add(obj);convertSingleObject(obj, jsonArray.getString(i));}}} catch (Exception e) {Log.d("convert", e.getMessage());}return objs;}/** * 使用该方法需要先创建一个object,传入第一个参数 将JSON格式的数据转换为一个对象 json参数的值必须是一个JSON格式的对象,不能是数组 *  * @param obj * @param json * @return */public static Object convertSingleObject(Object obj, String json) {if (obj == null || json == null)return obj;try {// 只使用public类型字段Field[] fields = obj.getClass().getFields();if (fields != null) {JSONObject jsonObject = new JSONObject(json);for (Field field : fields) {try {Object objValue = jsonObject.get(field.getName());// 字符串类型if (field.getType() == String.class) {field.set(obj, String.valueOf(objValue));}// long类型else if (field.getType() == long.class) {field.set(obj,Long.valueOf(String.valueOf(objValue)));} // int类型else if (field.getType() == int.class) {field.set(obj,Integer.valueOf(String.valueOf(objValue)));}// boolean类型else if (field.getType() == boolean.class) {field.set(obj, Boolean.getBoolean(String.valueOf(objValue)));}// Object类型(WeiboObject类型)else {Object fieldObject = field.getType().newInstance();if (fieldObject instanceof WeiboObject) {convertSingleObject(fieldObject,String.valueOf(objValue));field.set(obj, fieldObject);}}} catch (Exception e) {}}}} catch (Exception e) {}return obj;}}

到这里基本上把核心的代码贴完了,不过这里还有有一个类确实比较重要的,Utility这个类涉及到的都是Http通信,我们直接拿来用就可以的,不需要我们自己去写。要我说能完全自主开发出新浪微博客户端那确实很牛叉了,光是Http通信这一块,如果对http不熟悉,根本就不知道怎么来搞。

以上的代码并不是全部,但这些代码已经很有用了,对自己理解微博客户端的实现有了很大的启发。可能有些地方没能面面俱到,请见谅。下一篇博客可能会是关于发布一条微博的实现,敬请期待吧。


热点排行