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

else

sb.append(“

  • s.charAt(i) + “”);

}

break;

case 2: // 处理遇到@的情况

// 处理@后面的普通字符

if (Character.isJavaIdentifierPart(s.charAt(i))) {

str += s.charAt(i);

}

else {

// 如果只有一个@,作为普通字符处理

if (“@”.equals(str)) {

sb.append(str);

}

// 将@及后面的普通字符变成蓝色

else {

sb.append(setTextColor(str, String.valueOf(signColor)));

}

// @后面有#的情况,首先应将#添加到str里,这个值可能会变成蓝色,也可以作为普通字符,要看后面还有没有#了

if (s.charAt(i) == ‘#’) {

str = String.valueOf(s.charAt(i));

state = 3;

}

// @后面还有个@的情况,和#类似

else if (s.charAt(i) == ‘@’) {

str = String.valueOf(s.charAt(i));

state = 2;

}

// @后面有除了@、#的其他特殊字符。需要将这个字符作为普通字符处理

else {

if (commonTextColor == Color.BLACK)

sb.append(s.charAt(i));

else

sb.append(“

  • s.charAt(i) + “”);

state = 1;

str = “”;

}

}

break;

case 3: // 处理遇到#的情况

// 前面已经遇到一个#了,这里处理结束的#

if (s.charAt(i) == ‘#’) {

str += s.charAt(i);

sb.append(setTextColor(str, String.valueOf(signColor)));

str = “”;

state = 1;

}

// 如果#后面有@,那么看一下后面是否还有#,如果没有#,前面的#作废,按遇到@处理

else if (s.charAt(i) == ‘@’) {

if (s.substring(i).indexOf(“#”) < 0) {

sb.append(str);

str = String.valueOf(s.charAt(i));

state = 2;

} else {

str += s.charAt(i);

}

}

// 处理#…#之间的普通字符

else {

str += s.charAt(i);

}

break;

}

}

if (state == 1 || state == 3) {

sb.append(str);

} else if (state == 2) {

if (“@”.equals(str)) {

sb.append(str);

} else {

sb.append(setTextColor(str, String.valueOf(signColor)));

}

}

return sb.toString();

}

public static String setTextColor(String s, String color) {

String result = “” + s + “”;

return result;

}

public static String getTimeStr(Date oldTime, Date currentDate) {

long time1 = currentDate.getTime();

long time2 = oldTime.getTime();

long time = (time1 - time2) / 1000;

if (time >= 0 && time < 60) {

return “刚才”;

} else if (time >= 60 && time < 3600) {

return time / 60 + “分钟前”;

} else if (time >= 3600 && time < 3600 * 24) {

return time / 3600 + “小时前”;

} else {

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm”);

return sdf.format(oldTime);

}

}

}

上面定义了一个getWeibo()的方法,可以看到它是通过GlobalObject来获取微博对象的,那在看看这个类

/Wwj_sina_weibo/src/com/wwj/sina/weibo/GlobalObject.java

package com.wwj.sina.weibo;

import android.app.Activity;

import android.app.Application;

import com.weibo.net.Weibo;

import com.wwj.sina.weibo.interfaces.Const;

import com.wwj.sina.weibo.listener.AuthDialogListener;

import com.wwj.sina.weibo.net.PullFile;

import com.wwj.sina.weibo.object.Consumer;

import com.wwj.sina.weibo.workqueue.WorkQueueMonitor;

import com.wwj.sina.weibo.workqueue.WorkQueueStorage;

public class GlobalObject extends Application implements Const{

private Weibo weibo;

private WorkQueueStorage workQueueStorage;

private WorkQueueMonitor imageWorkQueueMonitor;

private WorkQueueMonitor taskWorkQueueMonitor;

public Weibo getWeibo(Activity activity) {

if (weibo == null || !weibo.isSessionValid()) {

weibo = Weibo.getInstance(); // 获取Weibo对象

weibo.setupConsumerConfig(Consumer.consumerKey, Consumer.consumerSecret);

weibo.setRedirectUrl(Consumer.redirectUrl);

weibo.authorize(activity, new AuthDialogListener(activity));

}

return weibo;

}

public Weibo getWeibo() {

return weibo;

}

public WorkQueueStorage getWorkQueueStorage() {

if (workQueueStorage == null){

workQueueStorage = new WorkQueueStorage();

}

return workQueueStorage;

}

public WorkQueueMonitor getWorkQueueMonitor(Activity activity) {

if (imageWorkQueueMonitor == null) {

imageWorkQueueMonitor = new WorkQueueMonitor(activity, getWorkQueueStorage(), new PullFile(), MONITOR_TYPE_IMAGE);

imageWorkQueueMonitor.start();

}

return imageWorkQueueMonitor;

}

}

可以看到这个类是Application级别的,说明最先加载的是这个类,来看这个类定义的getWeibo()方法,现在很直观啦,这里就是获取授权认证的地方。设置好consumerKey和consumerSecret后,就可以调用authorize()方法进行授权了。这个方法在Weibo这个类当中,这个类很重要,能不能使用微博功能就看它了。

/Wwj_sina_weibo/src/com/weibo/net/Weibo.java

/*

  • Copyright 2011 Sina.

  • Licensed under the Apache License and Weibo License, Version 2.0 (the “License”);

  • you may not use this file except in compliance with the License.

  • You may obtain a copy of the License at

  • http://www.open.weibo.com

  • http://www.apache.org/licenses/LICENSE-2.0

  • Unless required by applicable law or agreed to in writing, software

  • distributed under the License is distributed on an “AS IS” BASIS,

  • WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  • See the License for the specific language governing permissions and

  • limitations under the License.

*/

package com.weibo.net;

import java.io.IOException;

import java.net.MalformedURLException;

import android.Manifest;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.content.pm.PackageManager;

import android.os.Bundle;

import android.text.TextUtils;

import android.util.Log;

import android.webkit.CookieSyncManager;

/**

  • Encapsulation main Weibo APIs, Include: 1. getRquestToken , 2.

  • getAccessToken, 3. url request. Used as a single instance class. Implements a

  • weibo api as a synchronized way.

  • @author ZhangJie (zhangjie2@staff.sina.com.cn)

*/

public class Weibo {

// public static String SERVER = “http://api.t.sina.com.cn/”;

public static String SERVER = “https://api.weibo.com/2/”;

public static String URL_OAUTH_TOKEN = “http://api.t.sina.com.cn/oauth/request_token”;

public static String URL_AUTHORIZE = “http://api.t.sina.com.cn/oauth/authorize”;

public static String URL_ACCESS_TOKEN = “http://api.t.sina.com.cn/oauth/access_token”;

public static String URL_AUTHENTICATION = “http://api.t.sina.com.cn/oauth/authenticate”;

public static String URL_OAUTH2_ACCESS_TOKEN = “https://api.weibo.com/oauth2/access_token”;

// public static String URL_OAUTH2_ACCESS_AUTHORIZE =

// “http://t.weibo.com:8093/oauth2/authorize”;

public static String URL_OAUTH2_ACCESS_AUTHORIZE = “https://api.weibo.com/oauth2/authorize”;

private static String APP_KEY = “”;

private static String APP_SECRET = “”;

private static Weibo mWeiboInstance = null;

private Token mAccessToken = null;

private RequestToken mRequestToken = null;

private WeiboDialogListener mAuthDialogListener;

private static final int DEFAULT_AUTH_ACTIVITY_CODE = 32973;

public static final String TOKEN = “access_token”;

public static final String EXPIRES = “expires_in”;

public static final String DEFAULT_REDIRECT_URI = “wbconnect://success”;// 暂不支持

public static final String DEFAULT_CANCEL_URI = “wbconnect://cancel”;// 暂不支持

private String mRedirectUrl;

private Weibo() {

Utility.setRequestHeader(“Accept-Encoding”, “gzip”);

Utility.setTokenObject(this.mRequestToken);

mRedirectUrl = DEFAULT_REDIRECT_URI;

}

/**

  • 获取单例

  • @return

*/

public synchronized static Weibo getInstance() {

if (mWeiboInstance == null) {

mWeiboInstance = new Weibo();

}

return mWeiboInstance;

}

// 设置accessToken

public void setAccessToken(AccessToken token) {

mAccessToken = token;

}

public Token getAccessToken() {

return this.mAccessToken;

}

/**

  • 设置第三方key和secret

  • @param consumer_key

  • @param consumer_secret

*/

public void setupConsumerConfig(String consumer_key, String consumer_secret) {

Weibo.APP_KEY = consumer_key;

Weibo.APP_SECRET = consumer_secret;

}

public static String getAppKey() {

return Weibo.APP_KEY;

}

public static String getAppSecret() {

return Weibo.APP_SECRET;

}

public void setRequestToken(RequestToken token) {

this.mRequestToken = token;

}

public static String getSERVER() {

return SERVER;

}

public static void setSERVER(String sERVER) {

SERVER = sERVER;

}

// 设置oauth_verifier

public void addOauthverifier(String verifier) {

mRequestToken.setVerifier(verifier);

}

public String getRedirectUrl() {

return mRedirectUrl;

}

/**

  • 设置第三方回调页

  • @param mRedirectUrl

*/

public void setRedirectUrl(String mRedirectUrl) {

this.mRedirectUrl = mRedirectUrl;

}

/**

  • Requst sina weibo open api by get or post

  • @param url

  •        Openapi request URL.
    
  • @param params

  •        http get or post parameters . e.g.
    
  •        gettimeling?max=max_id&min=min_id max and max_id is a pair of
    
  •        key and value for params, also the min and min_id
    
  • @param httpMethod

  •        http verb: e.g. "GET", "POST", "DELETE"
    
  • @throws IOException

  • @throws MalformedURLException

  • @throws WeiboException

*/

public String request(Context context, String url, WeiboParameters params, String httpMethod,

Token token) throws WeiboException {

String rlt = Utility.openUrl(context, url, httpMethod, params, this.mAccessToken);

return rlt;

}

/**/

public RequestToken getRequestToken(Context context, String key, String secret,

String callback_url) throws WeiboException {

Utility.setAuthorization(new RequestTokenHeader());

WeiboParameters postParams = new WeiboParameters();

postParams.add(“oauth_callback”, callback_url);

String rlt;

rlt = Utility.openUrl(context, Weibo.URL_OAUTH_TOKEN, “POST”, postParams, null);

RequestToken request = new RequestToken(rlt);

this.mRequestToken = request;

return request;

}

public AccessToken generateAccessToken(Context context, RequestToken requestToken)

throws WeiboException {

Utility.setAuthorization(new AccessTokenHeader());

WeiboParameters authParam = new WeiboParameters();

authParam.add(“oauth_verifier”, this.mRequestToken.getVerifier()/* “605835” */);

authParam.add(“source”, APP_KEY);

String rlt = Utility.openUrl(context, Weibo.URL_ACCESS_TOKEN, “POST”, authParam,

this.mRequestToken);

AccessToken accessToken = new AccessToken(rlt);

this.mAccessToken = accessToken;

return accessToken;

}

public AccessToken getXauthAccessToken(Context context, String app_key, String app_secret,

String usrname, String password) throws WeiboException {

Utility.setAuthorization(new XAuthHeader());

WeiboParameters postParams = new WeiboParameters();

postParams.add(“x_auth_username”, usrname);

postParams.add(“x_auth_password”, password);

postParams.add(“oauth_consumer_key”, APP_KEY);

String rlt = Utility.openUrl(context, Weibo.URL_ACCESS_TOKEN, “POST”, postParams, null);

AccessToken accessToken = new AccessToken(rlt);

this.mAccessToken = accessToken;

return accessToken;

}

/**

  • 获取Oauth2.0的accesstoken

  • https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&

  • client_secret=YOUR_CLIENT_SECRET&grant_type=password&redirect_uri=

  • YOUR_REGISTERED_REDIRECT_URI&username=USER_NAME&pasword=PASSWORD

  • @param context

  • @param app_key

  • @param app_secret

  • @param usrname

  • @param password

  • @return

  • @throws WeiboException

*/

public Oauth2AccessToken getOauth2AccessToken(Context context, String app_key,

String app_secret, String usrname, String password) throws WeiboException {

Utility.setAuthorization(new Oauth2AccessTokenHeader());

WeiboParameters postParams = new WeiboParameters();

postParams.add(“username”, usrname);

postParams.add(“password”, password);

postParams.add(“client_id”, app_key);

postParams.add(“client_secret”, app_secret);

postParams.add(“grant_type”, “password”);

String rlt = Utility.openUrl(context, Weibo.URL_OAUTH2_ACCESS_TOKEN, “POST”, postParams,

null);

Oauth2AccessToken accessToken = new Oauth2AccessToken(rlt);

this.mAccessToken = accessToken;

return accessToken;

}

/**

  • Share text content or image to weibo .

*/

public boolean share2weibo(Activity activity, String accessToken, String tokenSecret,

String content, String picPath) throws WeiboException {

if (TextUtils.isEmpty(accessToken)) {

throw new WeiboException(“token can not be null!”);

}

// else if (TextUtils.isEmpty(tokenSecret)) {

// throw new WeiboException(“secret can not be null!”);

// }

if (TextUtils.isEmpty(content) && TextUtils.isEmpty(picPath)) {

throw new WeiboException(“weibo content can not be null!”);

}

Intent i = new Intent(activity, ShareActivity.class);

i.putExtra(ShareActivity.EXTRA_ACCESS_TOKEN, accessToken);

i.putExtra(ShareActivity.EXTRA_TOKEN_SECRET, tokenSecret);

i.putExtra(ShareActivity.EXTRA_WEIBO_CONTENT, content);

i.putExtra(ShareActivity.EXTRA_PIC_URI, picPath);

activity.startActivity(i);

return true;

}

private boolean startSingleSignOn(Activity activity, String applicationId,

String[] permissions, int activityCode) {

return false;

}

public static boolean flag = false;

private void startDialogAuth(Activity activity, String[] permissions) {

if(flag == true) return;

WeiboParameters params = new WeiboParameters();

if (permissions.length > 0) {

params.add(“scope”, TextUtils.join(“,”, permissions));

}

CookieSyncManager.createInstance(activity);

dialog(activity, params, new WeiboDialogListener() {

public void onComplete(Bundle values) {

flag = false;

// ensure any cookies set by the dialog are saved

CookieSyncManager.getInstance().sync();

if (null == mAccessToken) {

mAccessToken = new Token();

}

mAccessToken.setToken(values.getString(TOKEN));

mAccessToken.setExpiresIn(values.getString(EXPIRES));

if (isSessionValid()) {

Log.d(“Weibo-authorize”,

“Login Success! access_token=” + mAccessToken.getToken() + " expires="

  • mAccessToken.getExpiresIn());

mAuthDialogListener.onComplete(values);

} else {

Log.d(“Weibo-authorize”, “Failed to receive access token”);

mAuthDialogListener.onWeiboException(new WeiboException(

“Failed to receive access token.”));

}

}

public void onError(DialogError error) {

flag = false;

Log.d(“Weibo-authorize”, "Login failed: " + error);

mAuthDialogListener.onError(error);

}

public void onWeiboException(WeiboException error) {

flag = false;

Log.d(“Weibo-authorize”, "Login failed: " + error);

mAuthDialogListener.onWeiboException(error);

}

public void onCancel() {

flag = false;

Log.d(“Weibo-authorize”, “Login canceled”);

mAuthDialogListener.onCancel();

}

});

flag = true;

}

/**

  • User-Agent Flow

  • @param activity

  • @param listener

  •        授权结果监听器
    

*/

public void authorize(Activity activity, final WeiboDialogListener listener) {

authorize(activity, new String[] {}, DEFAULT_AUTH_ACTIVITY_CODE, listener);

}

@SuppressWarnings(“unused”)

private void authorize(Activity activity, String[] permissions,

final WeiboDialogListener listener) {

authorize(activity, permissions, DEFAULT_AUTH_ACTIVITY_CODE, listener);

}

private void authorize(Activity activity, String[] permissions, int activityCode,

final WeiboDialogListener listener) {

Utility.setAuthorization(new Oauth2AccessTokenHeader());

boolean singleSignOnStarted = false;

mAuthDialogListener = listener;

// Prefer single sign-on, where available.

if (activityCode >= 0) {

singleSignOnStarted = startSingleSignOn(activity, APP_KEY, permissions, activityCode);

}

// Otherwise fall back to traditional dialog.

if (!singleSignOnStarted) {

startDialogAuth(activity, permissions);

}

}

@SuppressWarnings(“unused”)

private void authorizeCallBack(int requestCode, int resultCode, Intent data) {

}

public void dialog(Context context, WeiboParameters parameters,

final WeiboDialogListener listener) {

parameters.add(“client_id”, APP_KEY);

parameters.add(“response_type”, “token”);

parameters.add(“redirect_uri”, mRedirectUrl);

parameters.add(“display”, “mobile”);

if (isSessionValid()) {

parameters.add(TOKEN, mAccessToken.getToken());

}

String url = URL_OAUTH2_ACCESS_AUTHORIZE + “?” + Utility.encodeUrl(parameters);

if (context.checkCallingOrSelfPermission(Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {

Utility.showAlert(context, “Error”,

“Application requires permission to access the Internet”);

} else {

new WeiboDialog(this, context, url, listener).show();

}

}

public boolean isSessionValid() {

if (mAccessToken != null) {

return (!TextUtils.isEmpty(mAccessToken.getToken()) && (mAccessToken.getExpiresIn() == 0 || (System

.currentTimeMillis() < mAccessToken.getExpiresIn())));

}

return false;

}

}

你们自己找到authorize()看看呗,怎么弹出那个登录界面的自己研究去,这个方法需要传入一个listener,

就是这个类了AuthDialogListener

/Wwj_sina_weibo/src/com/wwj/sina/weibo/listener/AuthDialogListener.java

授权完成后,回调这个类的onComplete方法,然后就可以获取微博数据了。

package com.wwj.sina.weibo.listener;

import android.app.Activity;

import android.os.Bundle;

import android.widget.Toast;

import com.weibo.net.DialogError;

import com.weibo.net.WeiboDialogListener;

import com.weibo.net.WeiboException;

import com.wwj.sina.weibo.HomeActivity;

import com.wwj.sina.weibo.adapter.WeiboListAdapter;

import com.wwj.sina.weibo.interfaces.Const;

import com.wwj.sina.weibo.library.StorageManager;

import com.wwj.sina.weibo.library.WeiboData;

import com.wwj.sina.weibo.library.WeiboManager;

import com.wwj.sina.weibo.object.User;

import com.wwj.sina.weibo.util.SettingUtil;

public class AuthDialogListener implements WeiboDialogListener {

private Activity activity;

public AuthDialogListener(Activity activity) {

super();

this.activity = activity;

}

public void onComplete(Bundle values) {

// 保存access_token 和 expires_in

String token = values.getString(“access_token”);

String expires_in = values.getString(“expires_in”);

SettingUtil.set(activity, SettingUtil.ACCESS_TOKEN, token);

SettingUtil.set(activity, SettingUtil.EXPIRES_IN, expires_in);

Toast.makeText(activity, “认证成功”, Toast.LENGTH_SHORT).show();

HomeActivity homeActivity = (HomeActivity) activity;

WeiboListAdapter weiboListAdapter = null;

long uid = Long.parseLong(values.getString(“uid”));

User user = WeiboManager.getUser(activity, uid);

if (user != null) {

homeActivity.username.setText(user.name);

StorageManager.setValue(activity, “uid”, uid); // 保存用户UID

}

weiboListAdapter = WeiboData.loadWeiboListData(activity, Const.HOME,

homeActivity.weiboListView);

homeActivity.homeData.weiboListAdapter = weiboListAdapter;

}

public void onWeiboException(WeiboException e) {

// 当认证过程中捕获到WeiboException时调用

Toast.makeText(activity, “Auth exception:” + e.getMessage(),

Toast.LENGTH_LONG).show();

}

public void onError(DialogError e) {

// Oauth2.0认证过程中,当认证对话框中的webView接收数据出现错误时调用此方法

Toast.makeText(activity, “Auth error:” + e.getMessage(),

Toast.LENGTH_LONG).show();

}

public void onCancel() {

// Oauth2.0认证过程中,如果认证窗口被关闭或认证取消时调用

Toast.makeText(activity, “Auth cancel”, Toast.LENGTH_LONG).show();

}

}

执行完这个就已经把数据显示出来了

WeiboData.loadWeiboListData(activity, Const.HOME,homeActivity.weiboListView);

这里又有一个WeiboData这个类,看看就明白了

package com.wwj.sina.weibo.library;

import java.util.List;

import android.app.Activity;

import android.widget.ListView;

import com.wwj.sina.weibo.adapter.WeiboListAdapter;

import com.wwj.sina.weibo.interfaces.Const;

import com.wwj.sina.weibo.object.Status;

import com.wwj.sina.weibo.util.Tools;

public class WeiboData implements Const {

public static WeiboListAdapter loadWeiboListData(Activity activity,

int type, ListView listView) {

return loadWeiboListData(activity, type, listView, null);

}

public static WeiboListAdapter loadWeiboListData(Activity activity,

int type, ListView listView, List statuses) {

WeiboListAdapter adapter = null;

if (Tools.hasWeibo(activity)) {

switch (type) {

case HOME:

if (statuses == null)

statuses = WeiboManager.getHomeTimeline(activity);

adapter = new WeiboListAdapter(activity, statuses, type);

break;

default:

break;

}

listView.setAdapter(adapter);

}

return adapter;

}

}

可以看到,这里ListView就直接setAdapter了。来看到第二个loadWeiboListData方法,有一个List statuses参数,这个就是保存微博数据的参数了,是怎么得到的?我们又可以看到一个类WeiboManager里有一个getHomeTimeline的方法,这个就是返回微博数据的方法。

等不及了,进去看看。

/Wwj_sina_weibo/src/com/wwj/sina/weibo/library/WeiboManager.java

package com.wwj.sina.weibo.library;

import java.io.File;

import java.util.List;

import android.app.Activity;

import com.weibo.net.AsyncWeiboRunner;

import com.weibo.net.AsyncWeiboRunner.RequestListener;

import com.weibo.net.Weibo;

import com.weibo.net.WeiboParameters;

import com.wwj.sina.weibo.interfaces.Const;

import com.wwj.sina.weibo.object.Consumer;

import com.wwj.sina.weibo.object.Status;

import com.wwj.sina.weibo.object.User;

import com.wwj.sina.weibo.util.Tools;

import com.wwj.sina.weibo.workqueue.DoneAndProcess;

import com.wwj.sina.weibo.workqueue.WorkQueueStorage;

import com.wwj.sina.weibo.workqueue.task.PullFileTask;

/**

  • 微博管理类,提供方法获取微博数据

  • @author Administrator

*/

public class WeiboManager implements Const {

public static List getHomeTimeline(Activity activity) {

return getHomeTimeline(activity, 0, 0, DEFAULT_STATUS_COUNT);

}

private static List getHomeTimeline(Activity activity,

long sinceId, long maxId, int count) {

return getHomeTimeline(activity, sinceId, maxId, count, false, null);

}

/**

  • 获取当前登录用户及其所关注用户的最新微博

  • @param activity

  • @param sinceId

  • @param maxId

  • @param count

  • @param async

  •        是否同步
    
  • @param listener

  • @return

*/

@SuppressWarnings(“unchecked”)

public static List getHomeTimeline(Activity activity,

long sinceId, long maxId, int count, boolean async,

RequestListener listener) {

// 访问接口url

String url = Weibo.SERVER + “statuses/home_timeline.json”;

// 获取微博对象

Weibo weibo = Tools.getWeibo(activity);

if (weibo == null || !weibo.isSessionValid()) {

return null;

}

WeiboParameters bundle = new WeiboParameters();

bundle.add(“source”, Consumer.consumerKey);

if (sinceId != 0)

bundle.add(“since_id”, String.valueOf(sinceId));

if (maxId != 0)

bundle.add(“max_id”, String.valueOf(maxId));

if (count != 0)

bundle.add(“count”, String.valueOf(count));

List statuses = null;

try {

if (!async) {

// 请求获取JSON数据

String json = weibo.request(activity, url, bundle, “GET”,

weibo.getAccessToken());

statuses = JSONAndObject

.convert(Status.class, json, “statuses”);

} else {

AsyncWeiboRunner asyncWeiboRunner = new AsyncWeiboRunner(weibo);

asyncWeiboRunner

.request(activity, url, bundle, “GET”, listener);

}

} catch (Exception e) {

}

return statuses;

}

public static String getImageurl(Activity activity, String url) {

return getImageurl(activity, url, null);

}

public static String getImageurl(Activity activity, String url,

DoneAndProcess doneAndProcess) {

String result = null;

if (url == null || “”.equals(url))

return result;

result = PATH_FILE_CACHE + “/” + url.hashCode();

File file = new File(PATH_FILE_CACHE + “/” + url.hashCode());

if (file.exists()) {

return result;

} else {

WorkQueueStorage workQueueStorage = Tools.getGlobalObject(activity)

.getWorkQueueStorage();

if (workQueueStorage != null) {

if (doneAndProcess == null) {

workQueueStorage.addDoneWebFileUrl(url);

} else {

PullFileTask pullFileTask = new PullFileTask();

pullFileTask.doneAndProcess = doneAndProcess;

pullFileTask.fileUrl = url;

workQueueStorage.addTask(pullFileTask);

}

}

result = null;

}

return result;

}

public static boolean hasPicture(Status status) {

if (status.thumbnail_pic != null && !“”.equals(status.thumbnail_pic))

return true;

if (status.retweeted_status != null) {

if (status.retweeted_status.thumbnail_pic != null

&& !“”.equals(status.retweeted_status.thumbnail_pic)) {

return true;

}

}

return false;

}

public static User getUser(Activity activity, long uid) {

return getUser(activity, uid, null, false, null);

}

public static User getUser(Activity activity, String screen_name) {

return getUser(activity, 0, screen_name, false, null);

}

public static User getUser(Activity activity, long uid, String screen_name,

boolean async, RequestListener listener) {

String url = Weibo.SERVER + “users/show.json”;

Weibo weibo = Tools.getWeibo(activity);

if (weibo == null || !weibo.isSessionValid()) {

return null;

}

User user = null;

WeiboParameters bundle = new WeiboParameters();

bundle.add(“source”, Consumer.consumerKey);

if (uid > 0) {

bundle.add(“uid”, String.valueOf(uid));

} else if (screen_name != null) {

bundle.add(“screen_name”, screen_name);

} else {

return user;

}

try {

if (!async) {

String json = weibo.request(activity, url, bundle, “GET”,

weibo.getAccessToken());

user = new User();

JSONAndObject.convertSingleObject((Object) user, json);

} else {

AsyncWeiboRunner asyncWeiboRunner = new AsyncWeiboRunner(weibo);

asyncWeiboRunner

.request(activity, url, bundle, “GET”, listener);

}

} catch (Exception e) {

}

return user;

}

}

只看 getHomeTimeline()这个方法,一直追踪,很快就可以知道这个微博数据是怎么得到的了。

public static List getHomeTimeline(Activity activity,

long sinceId, long maxId, int count, boolean async,

RequestListener listener) {

// 访问接口url

String url = Weibo.SERVER + “statuses/home_timeline.json”;

// 获取微博对象

Weibo weibo = Tools.getWeibo(activity);

if (weibo == null || !weibo.isSessionValid()) {

return null;

}

WeiboParameters bundle = new WeiboParameters();

bundle.add(“source”, Consumer.consumerKey);

if (sinceId != 0)

bundle.add(“since_id”, String.valueOf(sinceId));

if (maxId != 0)

bundle.add(“max_id”, String.valueOf(maxId));

if (count != 0)

bundle.add(“count”, String.valueOf(count));

List statuses = null;

try {

if (!async) {

// 请求获取JSON数据

String json = weibo.request(activity, url, bundle, “GET”,

weibo.getAccessToken());

statuses = JSONAndObject

.convert(Status.class, json, “statuses”);

} else {

AsyncWeiboRunner asyncWeiboRunner = new AsyncWeiboRunner(weibo);

asyncWeiboRunner

.request(activity, url, bundle, “GET”, listener);

}

} catch (Exception e) {

}

return statuses;

}

就是这个方法了,通过调用weibo对象的request()方法,返回Json字符串,通过解析得到的JSON字符串得到statuses数组。这里需要进行的转换,全靠JSONAndObject这个类

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);

最后

分享一份工作1到5年以上的Android程序员架构进阶学习路线体系,希望能对那些还在从事Android开发却还不知道如何去提升自己的,还处于迷茫的朋友!

  • 阿里P7级Android架构师技术脑图;查漏补缺,体系化深入学习提升

  • **全套体系化高级架构视频;**七大主流技术模块,视频+源码+笔记

有任何问题,欢迎广大网友一起来交流
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
ull;

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);

最后

分享一份工作1到5年以上的Android程序员架构进阶学习路线体系,希望能对那些还在从事Android开发却还不知道如何去提升自己的,还处于迷茫的朋友!

  • 阿里P7级Android架构师技术脑图;查漏补缺,体系化深入学习提升

    [外链图片转存中…(img-pmqakA15-1715097657666)]

  • **全套体系化高级架构视频;**七大主流技术模块,视频+源码+笔记

[外链图片转存中…(img-6muTL2EU-1715097657668)]

有任何问题,欢迎广大网友一起来交流
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值