1. 程式人生 > >Go專案(一)、伺服器資料拉取和Material Design風格

Go專案(一)、伺服器資料拉取和Material Design風格

一、前言:因為希望能能夠整合現在安卓的圍棋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專案中自己寫出一套非同步獲取資料的方法,並提供回撥方法。

三、小結

希望在網路程式設計這方面能有長足的進步吧!