在上一篇中,讲了官方样例,了解了授权和使用ShareActivity进行发表一个新浪微博。下面,来说一说不使用ShareActivity进行分享一条没有图片的微博。
我们通过授权,能够获得access_token和expires_in,我们可以把access_token记下,这样每一次调用API接口时,就不需要再次授权了,expires_in没有必要记录,一是因为暂时没有用,二是因为每一次授权返回的expires_in都是不一样的。
假设,我们现在已经有了access_token,现在我们想使用自己的UI来进行发表微博。我的UI就不展现了,内容就是一个文本框和一个按钮。因为一条微博的字数有限制,不能超过140个字,所以大家可以添加一个剩余字数提示的功能。
通过看ShareActivity发表按钮的单击事件,一步一步向下入,就会发现,发表微博时,调用了Weibo的request。在SDK跟随的文档中,也说明了这一点。
请求微博API |
|
接口名称 |
|
public String request(Context context, String url, WeiboParameters params, String httpMethod) |
|
参数名称 |
作用 |
context |
传递应用上下文环境,用于获取当前网络状态,弹出对话框等。 |
params |
封装每个微博API请求的参数对到实体类WeiboParameters中 |
httpMthod |
API请求方式 (“GET”, “POST”, “DELETE”) |
返回结果 |
|
String:返回所请求的服务器所返回的xml/json数据。 |
通过官方的API可以看到,发表一条微博需要访问的URL是https://api.weibo.com/2/statuses/update.json,是以POST方式进行访问,而且有一系列的参数。
1 Weibo weibo = Weibo.getInstance(); 2 3 AccessToken accessToken = new AccessToken(access_token, Weibo.getAppSecret()); 4 weibo.setAccessToken(accessToken); 5 weibo.setupConsumerConfig(Weibo.getAppKey(), Weibo.getAppSecret()); 6 7 WeiboParameters bundle = new WeiboParameters(); 8 bundle.add("access_token", access_token); 9 bundle.add("status", "文本框中的内容,由用户输入"); 10 11 try 12 { 13 weibo.request(MainActivity.this, "https://api.weibo.com/2/statuses/update.json", bundle, "POST", weibo.getAccessToken()); 14 } 15 catch (WeiboException e) 16 { 17 e.printStackTrace(); 18 }
我们根据API接口的规定,为http请求添加access_token和status参数,最终通过weibo.request成功发表了一条微博。
因为发表微博是通过网络访问的,所以可能会存在各种延迟,为了防止ANR,我们需要在一个新线程中进行发表微博。实际上我们是不需要自己去创建一个新线程的,因为SDK已经为我们提供了异步访问网络的方法了。
在AsyncWeiboRunner类中,同样存在request方法,该方法内部实际上还是调用了Weibo的request方法。不过比较搞笑的是,AsyncWeiboRunner的request创建一个Thread之后,居然调用的是run方法,没办法,自己改成start方法。
1 public void request(final Context context, final String url, final WeiboParameters params, final String httpMethod, final RequestListener listener) 2 { 3 new Thread() 4 { 5 @Override 6 public void run() 7 { 8 try 9 { 10 String resp = mWeibo.request(context, url, params, httpMethod, mWeibo.getAccessToken()); 11 listener.onComplete(resp); 12 } 13 catch (WeiboException ) 14 { 15 listener.onError(e); 16 } 17 } 18 }.start(); 19 }
AsyncWeiboRunner的request与Weibo的request方法的区别是最后一个参数的不同,AsyncWeiboRunner的request最后一个参数,是一个接口,主要是帮助我们知晓我们所发表的微博是否成功或者失败了。这是RequestListener接口的定义。
1 public static interface RequestListener 2 { 3 /*微博发表成功*/ 4 public void onComplete(String response); 5 6 /*异常*/ 7 public void onIOException(IOException e); 8 9 /*微博发表失败*/ 10 public void onError(WeiboException e); 11 }
当我们发表一条微博成功时,就会调用onComplete方法,失败则会调用onError方法,如果发表的过程中产生了异常,则会调用onIOException方法。从这一点来看,AsyncWeiboRunner的request比Weibo的request方法更方便,更容易使用。
下面来一个使用AsyncWeiboRunner发表一条微博的代码。
1 Weibo weibo = Weibo.getInstance(); 2 3 AccessToken accessToken = new AccessToken(access_token, Weibo.getAppSecret()); 4 Weibo.getInstance().setAccessToken(accessToken); 5 weibo.setupConsumerConfig(Weibo.getAppKey(), Weibo.getAppSecret()); 6 7 WeiboParameters bundle = new WeiboParameters(); 8 bundle.add("access_token", access_token); 9 bundle.add("status", "文本框中的内容,由用户输入"); 10 11 AsyncWeiboRunner weiboRunner = new AsyncWeiboRunner(weibo); 12 weiboRunner.request(MainActivity.this, "https://api.weibo.com/2/statuses/update.json", bundle, 13 Utility.HTTPMETHOD_POST, new RequestListener() 14 { 15 @Override 16 public void onComplete(String response) 17 { 18 19 } 20 21 @Override 22 public void onIOException(IOException e) 23 { 24 e.printStackTrace(); 25 } 26 27 @Override 28 public void onError(WeiboException e) 29 { 30 e.printStackTrace(); 31 } 32 });
在onComplete方法中,参数response是新浪服务器返回给我们的json数据,我们可以在onComplete方法中对此进行解析,获取一些我们要的数据。
json解析,明天再说。