|
|
|
|
移动端

从 Twitter 读取数据

《Learning Android(中文版)》第8章服务,在本章,我们将动手创建一个服务。这个服务的任务是在后台运行的,获取用户在Twitter上最新的时间轴消息,并更新到应用上。本节为大家介绍从 Twitter 读取数据。

作者:李亚舟/任中龙/杜钢译来源:电子工业出版社|2012-07-27 11:37

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


从 Twitter 读取数据

我们现在有了个框架,已经准备好去做一些实际的工作,连接到像Twitter这样的服务、读取状态数据,并且在程序中显示数据。Twitter和其他类似Twitter的服务提供各种各样的API来获得我们的朋友状态。第三方库jtwitter.jar把其中大部分接口封装在Twitter类中,提供给了我们。里边最常用的功能之一也许就是getFriendsTimeline()方法,它可以返回24小时之内从自己和朋友那里发出的最新的20条消息。

要使用Twitter API的特性,首先应连接到它的在线服务。因此我们需要这个在线服务的一个用户名、对应的密码,以及它的API地址。回忆下102页的“Yamba的Application对象”一节中,我们已经把大部分的相关功能重构到了YambaApplication对象中。因此我们得以在这里重用这一功能,因为我们的服务也是这个应用的一部分,所以能够访问到同一个Application对象。

但首先还需要稍微修改一下YambaAppliaction,因为我们需要知道这个服务是否正在运行。要做到这一点,需要在YambaApplication中添加一个标志变量,并提供setter与getter方法用来访问和修改这个标志:

  1. public class YambaApplication extends Application  
  2. implements OnSharedPreferenceChangeListener {  
  3. private boolean serviceRunning; //   
  4. ...  
  5. public boolean isServiceRunning() { //  
  6. return serviceRunning;  
  7. }  
  8. public void setServiceRunning(boolean serviceRunning) { //   
  9. this.serviceRunning = serviceRunning;  
  10. }  

这个标志变量表示服务是否在运行。注意它是这个类的私有成员,外部不能直接访问或修改。

这个公共方法用来访问serviceRunning标志的状态。

另一个公共方法,用来设置serviceRunning标志的状态。

接下来我们可以为UpdaterService增加一些代码,让它连接到在线API,读取朋友们的最新消息。例8-6是最终的版本。

例8-6:UpdaterService.java, final version

  1. package com.marakana.yamba3;  
  2. import java.util.List;  
  3. import winterwell.jtwitter.Twitter;  
  4. import winterwell.jtwitter.TwitterException;  
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.os.IBinder;  
  8. import android.util.Log;  
  9. public class UpdaterService extends Service {  
  10. private static final String TAG = "UpdaterService";  
  11. static final int DELAY = 60000; // 等待时间为1分钟  
  12. private boolean runFlag = false;  
  13. private Updater updater;  
  14. private YambaApplication yamba; // .  
  15. @Override  
  16. public IBinder onBind(Intent intent) {  
  17. return null;  
  18. }  
  19. @Override  
  20. public void onCreate() {  
  21. super.onCreate();  
  22. this.yamba = (YambaApplication) getApplication(); // .  
  23. this.updater = new Updater();  
  24. Log.d(TAG, "onCreated");  
  25. }  
  26.  
  27. @Override  
  28. public int onStartCommand(Intent intent, int flags, int startId) {  
  29. super.onStartCommand(intent, flags, startId);  
  30. this.runFlag = true;  
  31. this.updater.start();  
  32. this.yamba.setServiceRunning(true); //   
  33. Log.d(TAG, "onStarted");  
  34. return START_STICKY;  
  35. }  
  36. @Override  
  37. public void onDestroy() {  
  38. super.onDestroy();  
  39. this.runFlag = false;  
  40. this.updater.interrupt();  
  41. this.updater = null;  
  42. this.yamba.setServiceRunning(false); //   
  43. Log.d(TAG, "onDestroyed");  
  44. }  
  45. /**  
  46. * ....  
  47. */  
  48. private class Updater extends Thread {  
  49. List<Twitter.Status> timeline; //   
  50. public Updater() {  
  51. super("UpdaterService-Updater");  
  52. }  
  53. @Override  
  54. public void run() {  
  55. UpdaterService updaterService = UpdaterService.this;  
  56. while (updaterService.runFlag) {  
  57. Log.d(TAG, "Updater running");  
  58. try {  
  59. // .....  
  60. try {  
  61. timeline = yamba.getTwitter().getFriendsTimeline(); //   
  62. } catch (TwitterException e) {  
  63. Log.e(TAG, "Failed to connect to twitter service", e); //   
  64. }  
  65. // 遍历时间轴并输出  
  66.  
  67. for (Twitter.Status status : timeline) { //   
  68. Log.d(TAG, String.format("%s: %s", status.user.name, status.text)); //   
  69. }  
  70. Log.d(TAG, "Updater ran");  
  71. Thread.sleep(DELAY);  
  72. } catch (InterruptedException e) {  
  73. updaterService.runFlag = false;  
  74. }  
  75. }  
  76. }  
  77. } // Updater  

这个变量用以方便访问YambaApplication对象,以使用其中的共享功能,比如读取首选项、连接到线上服务等。

通过getApplication()调用获得YambaApplication对象的引用。

一旦启动了这个服务,就修改共享的应用对象YambaApplication中的标志变量serviceRunning以标记状态。

类似地,等服务停止时,再次修改application对象中的标志变量。

我们使用Java中的泛型(http://en.wikipedia.org/wiki/Generics_in_Java),将timeline变量的类型定义为List,且列表内的元素为Twitter.Status实例。

调用YambaApplication中的getTwitter()方法获得twitter对象,然后调用getFriendsTimeline()来获得24小时内朋友最新的20条消息。注意,该函数是一个实际访问远程服务的方法,需要一定时间才能完成,时间长短依赖于网络延迟情况。我们把它安置在一个独立的线程中,因此即使需要等待网络操作完成,也不会影响到主UI线程的交互。

网络请求可能因为很多原因而失败。我们在这里处理异常时,只打印出错时的堆栈信息。实际的输出信息可以在LogCat中查看。

现在我们已经初始化了timeline列表,可以遍历其中的元素。最简单的方法就是使
用Java的“for each”循环,自动遍历我们的列表,每次把一个元素的引用赋给变量
status。

我们暂时只是简单地把“谁说了什么”的消息输出到 LogCat。

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

游戏关卡设计

《半条命》作者倾心写就 暴雪总裁等业内专家强力推荐 盛大公司专业团队翻译 一起来创造引人入胜的游戏体验吧! 任何精彩游戏的核心部分...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊