Go專案(一)、伺服器資料拉取和Material Design風格
阿新 • • 發佈:2019-01-31
一、前言:因為希望能能夠整合現在安卓的圍棋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專案中自己寫出一套非同步獲取資料的方法,並提供回撥方法。
三、小結
希望在網路程式設計這方面能有長足的進步吧!