Friday, June 17, 2011

安能饭否笔记2-请求响应

想要借用安能的weibo、http代码新建一个项目,学习测试fanfou api。做下去才知道这2个包的并非完全独立,对应用层模块有不小的依赖性。

先想闭着眼睛做加法,结果要加入的模块越来越多。看来改代码是必然的啦。
再想做减法,也没有完全的把握,不如退而结网,把代码看明白。看了代码以后,确定做减法是可行的。

== 以最简单的login为例,从task出发
com.ch_linghu.fanfoudroid.LoginActivity.LoginTask._doInBackground(TaskParams...)
    user= TwitterApplication.mApi.login(username, password);


== 进入weibo模块
com.ch_linghu.fanfoudroid.fanfou.Weibo.login(String, String)
    http.setCredentials(username, password);// 保存id/password到httpclient
    User user = verifyCredentials();

// 发送请求,返回User对象
com.ch_linghu.fanfoudroid.fanfou.Weibo.verifyCredentials()
        return new User(get(getBaseURL() + "account/verify_credentials.json"
                , true).asJSONObject());
get的输入参数就是fanfou检验用户名密码是否正确的路径:
http://api.fanfou.com/account/verify_credentials.[json|xml]

// 调用httpClient.Get 返回respond
com.ch_linghu.fanfoudroid.fanfou.Weibo.get(String, boolean)
       return get(url, null, authenticate);
com.ch_linghu.fanfoudroid.fanfou.Weibo.get(String, ArrayList<BasicNameValuePair>, boolean)
return http.get(url, authenticated);


== 进入httpClient:req/rsp
// 初始化,对于http还有不少不明白,只是简单地概述了一下
public HttpClient() {
        prepareHttpClient();
// 关于连接        
设置最大连接数 10
设置http版本 1.1
设置http:80,https:443
把上述设置保存在param里,创建DefaultHttpClient
mClient = new DefaultHttpClient(cm, params);      
支持gzip

// 关于认证
设置basic auth
mAuthScope
(m)localcontext


// Interceptor==拦截,preemptive=先发制人
mClient.addRequestInterceptor(preemptiveAuth, 0);
private static HttpRequestInterceptor preemptiveAuth = new HttpRequestInterceptor()
用来预处理处理http的request?



// 发送指令
com.ch_linghu.fanfoudroid.http.HttpClient.get(String, boolean)
        return httpRequest(url, null, authenticated, HttpGet.METHOD_NAME);


com.ch_linghu.fanfoudroid.http.HttpClient.httpRequest(String, ArrayList<BasicNameValuePair>, File, boolean, String)
  // Create POST, GET or DELETE METHOD
        method = createMethod(httpMethod, uri, file, postParams);
        // Setup ConnectionParams, Request Headers
        SetupHTTPConnectionParams(method);
        // Execute Request
       // 因为是同步协议,现在响应已经收到
        response = mClient.execute(method, localcontext);
        res = new Response(response);
        
        if (response != null) {
            int statusCode = response.getStatusLine().getStatusCode(); // 处理状态 当响应码不为200时都会报出此异常:
            // It will throw a weiboException while status code is not 200
            HandleResponseStatusCode(statusCode, res);
    // 返回respond     
            return res;


== 通用respond(json) ---> 业务数据(user)
// 发送请求
com.ch_linghu.fanfoudroid.fanfou.Weibo.verifyCredentials()
        return new User(get(getBaseURL() + "account/verify_credentials.json"
                , true).asJSONObject());
                
com.ch_linghu.fanfoudroid.fanfou.User.User(JSONObject)
init(json);

com.ch_linghu.fanfoudroid.fanfou.User.init(JSONObject)
id = json.getString("id");
    name = json.getString("name");                
    .....

=================================================================================

再看看业务数据怎么显示到界面上?
== 以首页TweetActivity为例,还是从Task出发,发送请求
com.ch_linghu.fanfoudroid.ui.base.TwitterCursorBaseActivity.RetrieveTask._doInBackground(TaskParams...)
    String maxId = fetchMaxId(); 
    statusList = getMessageSinceId(maxId);
上面2个方法都是abstract

取出当前页(TYPE_HOME)的最大id
com.ch_linghu.fanfoudroid.TwitterActivity.fetchMaxId()
    return getDb().fetchMaxTweetId(getUserId(), StatusTable.TYPE_HOME);

已知消息id,查询时间线
com.ch_linghu.fanfoudroid.TwitterActivity.getMessageSinceId(String)    
    return getApi().getFriendsTimeline(new Paging(maxId));
    return getApi().getFriendsTimeline();

访问weibo, 返回List<Status>
com.ch_linghu.fanfoudroid.fanfou.Weibo.getFriendsTimeline(Paging)
    return Status.constructStatuses(get(getBaseURL() + "statuses/friends_timeline.json",null, paging, true));


== Task处理响应
// List<Status> ===〉ArrayList<Tweet>

com.ch_linghu.fanfoudroid.ui.base.TwitterCursorBaseActivity.RetrieveTask._doInBackground(TaskParams...)
    ArrayList<Tweet> tweets = new ArrayList<Tweet>();
    for (com.ch_linghu.fanfoudroid.fanfou.Status status : statusList)
    tweets.add(Tweet.create(status));
    mRetrieveCount = addMessages(tweets, false); // 又是abstract


// ArrayList<Tweet> ===〉dbcom.ch_linghu.fanfoudroid.TwitterActivity.addMessages(ArrayList<Tweet>, boolean)
for (Tweet t : tweets)
            getDb().createWeiboUserInfo(t.user);
    return getDb().putTweets(tweets, getUserId(), StatusTable.TYPE_HOME, isUnread);      

后续应该会同步db和listView吧?

No comments:

Post a Comment