這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
零、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項目中自己寫出一套非同步擷取資料的方法,並提供回調方法。
三、小結
希望在網路編程這方面能有長足的進步吧!