Android新浪微博开发(2)发表一条微博

  在上一篇中,讲了官方样例,了解了授权和使用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解析,明天再说。

posted @ 2012-10-09 18:11  猪圈里的猪  阅读(556)  评论(0编辑  收藏  举报