前面把基本的东西讲完了,之后就是数据的获取和解析显示出来了,那接下来我们就负责抓取数据的这块吧,首先我们须要

在清单文件中载入服务和活动



加入:、

 <activity android:name="com.neweriweibo.activity.OAuthActivity"/>
<activity android:name=".MainActivity"/>
<activity android:name="com.neweriweibo.activity.SendMessageActivity"/> <!-- 获取自己微博信息 -->
<service android:name="com.neweriweibo.service.UserService"/> <!-- 获取全部微博的信息 -->
<service android:name="com.neweriweibo.service.WeiBoService"/>

以下看看用户个人信息的抓取:

package com.neweriweibo.service;
/**
* 个人信息数据抓取、
* @author Engineer-Jsp
* @date 2014.10.28
* */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL; import org.json.JSONArray;
import org.json.JSONObject; import com.neweriweibo.model.User;
import com.neweriweibo.utils.TencentAPI; import android.app.IntentService;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.util.Log;
public class UserService extends IntentService { public final static String UPDATA = "com.neweriweibo.service.UPDATA";
public final static String NOW_WEATHER = "UserWeiBo" ;
private StringBuffer _buff;
private File weibousercurrentFile;
private BufferedWriter write;
private BufferedWriter writefour;
private static BufferedReader reader ;
private String access_token;
private String openid;
private String openkey; public UserService(){
super("WeatherService") ;
}
@Override
public void onCreate() { super.onCreate();
weibousercurrentFile = new File(Environment.getExternalStorageDirectory(), "weiinfo");
if (!weibousercurrentFile.exists()) {
try {
weibousercurrentFile.createNewFile();// 创建
} catch (IOException e) {
e.printStackTrace();
}
}
access_token = PreferenceManager.getDefaultSharedPreferences(this).getString("access_token", "access_token");
openid = PreferenceManager.getDefaultSharedPreferences(this).getString("openid", "openid");
openkey = PreferenceManager.getDefaultSharedPreferences(this).getString("openkey", "openkey"); } @Override
public void onDestroy() { super.onDestroy(); } /**
* https://open.t.qq.com/api/user/info
* ? oauth_consumer_key=801506473
* &access_token=789a7d5284d0c3e608f8e384c993d04b
* &openid=0027BC08DB5B45D7461E9A0F16F527E7
* &clientip=CLIENTIP&oauth_version=2.a&scope=all
*/ @Override
protected void onHandleIntent(Intent intent) {
// oauth_consumer_key=801506545&access_token=c63ed52ee874eff6e61dfe66d2c7b396&openid=0027BC08DB5B45D7461E9A0F16F527E7&clientip=CLIENTIP&oauth_version=2.a&scope=all
// oauth_consumer_key=xx&access_token=xx&openid=xx&clientip=xx&oauth_version=2.a&scope=xx
User weibouser = new User();
StringBuffer buff = new StringBuffer(TencentAPI.userInfo) ;
buff.append("?").append("oauth_consumer_key="+TencentAPI.client_id )
.append("&access_token="+access_token)
.append("&openid="+openid)
.append("&clientip=CLIENTIP&oauth_version=2.a&scope=all") ; Log.i("获取当前登录账户个人信息的请求地址:", buff.toString()+"") ; try {
URL _url = new URL(buff.toString());
HttpURLConnection conn = (HttpURLConnection) _url.openConnection();
conn.setConnectTimeout(8000);
conn.setReadTimeout(8000);
conn.setDoOutput(false);
conn.setRequestMethod("GET"); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream in = conn.getInputStream();
InputStreamReader reader = new InputStreamReader(in, "utf-8");
BufferedReader buffere = new BufferedReader(reader);
StringBuilder builder = new StringBuilder();
String line = null;
while (null != (line = buffere.readLine())) {
builder.append(line);
} String json = builder.toString(); Log.i("获取当前登录账户个人信息的数据:", json.toString()+"\n") ;
// 解析数据 JSONObject root = new JSONObject(json).getJSONObject("data") ;
JSONArray tweetinfo = root.getJSONArray("tweetinfo");
Log.d("用户近期的一条原创微博:", tweetinfo.toString());
JSONObject zero = tweetinfo.getJSONObject(0);
String nearinfo = zero.getString("text");
Log.d("原创微博信息:", nearinfo.toString());
String nick = root.getString("nick") ;
String idolnum = root.getString("idolnum") ;
String location = root.getString("location") ;
String brithyear = root.getString("birth_year") ;
String brithmonth = root.getString("birth_month") ;
String brithday = root.getString("birth_day") ;
String introduction = root.getString("introduction") ;
String headimg = root.getString("head")+"/40";
String fansnum = root.getString("fansnum");
String tweetnum = root.getString("tweetnum");
String sex = root.getString("sex");
Log.d("sex内容測试,刚取得:", sex);
if(sex.equals("1")){
sex = "男";
}else if(sex.equals("2")){
sex = "女";
}else{
sex = "";
}
Log.d("sex内容測试,推断后:", sex);
write = new BufferedWriter(new FileWriter(weibousercurrentFile));
write.write(nick + "*" + idolnum + "*" + location+ "*" + brithyear+"/"+brithmonth+"/"+brithday+"*"+introduction+"*"+headimg+"*"+fansnum+"*"+tweetnum+"*"+sex+"*"+nearinfo);
write.close(); weibouser.setNick(nick) ;
weibouser.setIdonum(idolnum);
weibouser.setLoacation(location) ;
weibouser.setBirthyeaer(brithyear);
weibouser.setBirthmonth(brithmonth);
weibouser.setBirthday(brithday) ;
weibouser.setHeadimg(headimg);
weibouser.setInfo(introduction) ;
weibouser.setFansnum(fansnum);
weibouser.setTweetnum(tweetnum);
weibouser.setSex(sex);
weibouser.setNearinfo(nearinfo);
conn.disconnect();
} } catch (Exception e) {
e.printStackTrace();
} Intent _intent = new Intent(UPDATA);
Bundle mBundle = new Bundle();
mBundle.putParcelable(UserService.NOW_WEATHER, weibouser);
_intent.putExtras(mBundle); sendBroadcast(_intent) ; } }

常规的网络请求抓取数据。将解析到的数据存在User对象里,而且在本地用BuffereWriter保存了一份。方便下登录,且考虑在没有网络的情况下或者数据抓取失败的情况下不至于界面因没有数据而显得空洞,不美观

将获取的数据意图发送至应用程序,其它活动接收,并获取数据,显示在界面

User:

package com.neweriweibo.model;
/**
* 用户信息对象
* @author Engineer-Jsp
* @date 2014.10.28
* */
import android.os.Parcel;
import android.os.Parcelable; public class User implements Parcelable{ private String nick ;// 昵称
private String info ;// 自我介绍
private String loacation ;// 所在地
private String idonum ; //关注的人数 private String birthyeaer ;// 生日年
private String birthmonth ;// 生日月
private String birthday ;// 生日天
private String headimg;// 头像 private String fansnum;// 被关注数
private String tweetnum; // 发表的微博数
private String sex; // 性别
private String nearinfo; //用户近期的一条原创微博
public String getNearinfo() {
return nearinfo;
}
public void setNearinfo(String nearinfo) {
this.nearinfo = nearinfo;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getFansnum() {
return fansnum;
}
public void setFansnum(String fansnum) {
this.fansnum = fansnum;
}
public String getTweetnum() {
return tweetnum;
}
public void setTweetnum(String tweetnum) {
this.tweetnum = tweetnum;
} public String getHeadimg() {
return headimg;
}
public void setHeadimg(String headimg) {
this.headimg = headimg;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getLoacation() {
return loacation;
}
public void setLoacation(String loacation) {
this.loacation = loacation;
}
public String getIdonum() {
return idonum;
}
public void setIdonum(String idonum) {
this.idonum = idonum;
}
public String getBirthyeaer() {
return birthyeaer;
}
public void setBirthyeaer(String birthyeaer) {
this.birthyeaer = birthyeaer;
}
public String getBirthmonth() {
return birthmonth;
}
public void setBirthmonth(String birthmonth) {
this.birthmonth = birthmonth;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public User(String nick, String info, String loacation, String idonum,
String birthyeaer, String birthmonth, String birthday,String headimg,
String fansnum , String tweetnum,String sex,String nearinfo) {
super();
this.nick = nick;
this.info = info;
this.loacation = loacation;
this.idonum = idonum;
this.birthyeaer = birthyeaer;
this.birthmonth = birthmonth;
this.birthday = birthday;
this.headimg = headimg;
this.fansnum = fansnum;
this.tweetnum = tweetnum;
this.sex = sex;
this.nearinfo = nearinfo;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "User [昵称=" + nick + ", 自我介绍=" + info + ", 城市="
+ loacation + ", 关注数=" + idonum + ", 年="
+ birthyeaer + ", 月=" + birthmonth + ", 日="
+ birthday + ",头像地址="+headimg+",听众="+fansnum+",发表微博数="+tweetnum+",性别="+sex+
",近期动态="+nearinfo+"]";
} public static final Parcelable.Creator<User> CREATOR = new Creator<User>() { @Override
public User createFromParcel(Parcel source) {
// TODO Auto-generated method stub
User user = new User() ; user.nick = source.readString() ;
user.info = source.readString() ;
user.loacation = source.readString() ;
user.idonum = source.readString() ;
user.birthyeaer = source.readString() ;
user.birthmonth = source.readString() ;
user.birthday = source.readString() ;
user.headimg = source.readString();
user.fansnum = source.readString();
user.tweetnum = source.readString();
user.sex = source.readString();
user.nearinfo = source.readString();
return user;
} @Override
public User[] newArray(int size) {
// TODO Auto-generated method stub
return new User[size];
}
}; @Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(nick);
dest.writeString(info);
dest.writeString(loacation);
dest.writeString(idonum);
dest.writeString(birthyeaer);
dest.writeString(birthmonth);
dest.writeString(birthday);
dest.writeString(headimg);
dest.writeString(fansnum);
dest.writeString(tweetnum);
dest.writeString(sex);
dest.writeString(nearinfo);
} }

UserService extends IntentService 重写onHandleIntent(Intent intent) 。事实上就相当于开启了一个子线程,来对网络请求进行处理,IntentService使用队列的方式将请求的Intent增加队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完毕一个之后再处理第二个,每个请求都会在一个单独的worker
thread中处理,不会堵塞应用程序的主线程。这里就给我们提供了一个思路。假设有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作

最新文章

  1. [LeetCode] Best Time to Buy and Sell Stock III 买股票的最佳时间之三
  2. acdream 1681 跳远女王(BFS,暴力)
  3. HDU 2553 n皇后问题(回溯法)
  4. WinAPI——谐振动的合成
  5. Introduction to the POM
  6. Java中的static关键字
  7. Android中Dialog对话框
  8. #include &lt;map&gt;
  9. 初学NodeJs
  10. JSP学习1---创建一个简单的jsp程序
  11. puppet一个完整的实例
  12. 常见模块(五) random模块
  13. mysql 视图,事务,存储过程,触发器
  14. weblogic下更改jsp不生效的解决办法
  15. python 爬虫系列教程方法总结及推荐
  16. 图片切换(手动切换,imagelist的单独使用)
  17. 字符串匹配:KMP算法, Boyer-Moore算法理解与总结
  18. bzoj 1070 [SCOI2007]修车——网络流(拆边)
  19. C#中List调用库函数sort进行升序排序
  20. numpy中的matrix与array的区别

热门文章

  1. 10CSS高级滤镜
  2. idea拉出Output窗口和还原窗口
  3. 反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例
  4. js 技巧 (九)按键JS
  5. 源码学习-Object类
  6. LeetCode(61) Rotate List
  7. vscode调试nodejs
  8. 【转】ASP.NET MVC 4 RC的JS/CSS打包压缩功能
  9. java中检测-在运行时指定对象是否是特定类的一个实例---关键字 instanceof
  10. Web框架django基础篇