零、Go项目的github地址:https://github.com/fantianwen/Go
一、前言:因为希望能能够整合现在安卓的围棋app中较好的东西和当下较为流行的App中常见的功能,于是,打算开始这个叫Go的项目。
初步希望实现的功能:
1、使用Material Design风格进行app界面的搭建;
2、具体实现模块:1>用户中心;
2>新闻中心;
二、新闻中心的实现:
2.1、使用技术:Jsoup,tcpdump,wireshark,本来打算使用tcpdump和wireshark来进行sina体育客户端的数据包的抓取,然后分析出sina体育客户端和服务器端的交互接口。希望有时间能够学习下lunix下的抓包工具tcpdump命令。使用tcpdump分析数据接口失败之后,就使用了别人博客上没有使用的jsoup工具,jsoup能够根据url地址解析出该界面中所有的link链接等东西。这样,有了这样的工具,就能根据sina页面的url去解析出这个页面信息为我们所用。
2.1.1、使用tcpdump和wireshake进行抓包
在lunix下面,我们可以使用tcpdump进行转包,在安卓shell下面,我们同样可以使用这个命令去抓取好该安卓机器进行交互的数据包。具体操作:
1、将tcpdump指令push到android文件目录中去:
RadAsm:~ RadAsm$ adb push /Users/RadAsm/Desktop/tcpdump /data/local/
1889 KB/s (749040 bytes in 0.387s)
2、在adb shell模式下运行tcpdump指令进行该手机和服务器端的数据包的抓取
adb shell
cd data/local/
tcpdump -n -s 0 -w /sdcard/go/news.pcap(将抓取的数据包存储到sdcard下面)
3、这样,在/sdcard/go/目录下面就有了一个叫做news.pcap的数据包
4、接下来,使用wireshark进行数据包的分析,一般性而言,app即时性非特别高的,使用http协议,即时性要求很高的,可以使socket方式进行实现。
5、在wireshark下面找到和app服务器进行交互的数据包,分析出url接口访问地址即可。
2.1.2、使用jsoup对url对应的html页面进行解析,解析出我们希望的信息(如页面链接,新闻标题等等)
jsoup解析html页面代码实现:
public class HtmlUtils {
//list contained url link
private static ArrayList<NewsModel> newsList =new ArrayList<NewsModel>();
/**
* form a url in net,we can parse all the useful information for us
* @param url
* @return
*/
public static ArrayList<NewsModel> parseDataFromHtml(String url) {
Document doc = null;
try {
doc = Jsoup.connect(url).get();
} catch (IOException e) {
e.printStackTrace();
}
Elements links = doc.select("a[href]");
Elements imports = doc.select("link[href]");
Elements times = doc.select("font[class]");
Log.e("time",times.size()+"");
for (Element link : links) {
/**
* put all the url to list
*/
//judge wheather this news is a weiqi news
String content=trim(link.text(),35);
if(content.length()>13){
//we can judge that this is a weiqi news,and we add this news to the list
NewsModel newsModel = new NewsModel();
newsModel.setUrl(link.attr("abs:href"));
newsModel.setContent(trim(link.text(),35));
newsList.add(newsModel);
}
}
Log.e("links",newsList.size()+"");
for (int i=0;i<times.size();i++){
NewsModel newsModel = newsList.get(i);
Element element = times.get(i);
newsModel.setUpdateTime(trim(element.text(),35));
Log.e("lklklkl", newsList.get(i).getUpdateTime());
}
return newsList;
}
private static String trim(String s, int width) {
if (s.length() > width)
return s.substring(0, width - 1) + ".";
else
return s;
}
}
在这个类中,我企图将html中我们希望的页面元素解析到一个ArrayList中。以方便RecyclerView的数据加载。
2.2、具体实现中碰到的问题
2.2.1、新闻页面的数据的ArrayList的数据的获取
要知道,我们希望获取到的数据的特征,比方说新闻标题的长度什么的,然后根据这个长度将数据获取到返回。
2.2.2、RecyclerView问题
其一、
View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,parent,false); NewsViewHolder newsViewHolder=new NewsViewHolder(v);
在onCreateViewHolder中返回的ViewHolder会在自己建立的ViewHolder的构造方法中实现,而需要了解的是:这里的View的对象是RecyclerView的每个Item的根布局的实现。
2.2.3、jsoup数据解析问题
在jsoup中数据的获取输在主线程中实现的,我们需要自己开一个子线程,这样比较不美观,往后还是希望能够将jsoup项目中自己写出一套异步获取数据的方法,并提供回调方法。
三、小结
希望在网络编程这方面能有长足的进步吧!
有疑问加站长微信联系(非本文作者)