Go项目(一)、服务器数据拉取和Material Design风格

HNAer_RadAsm · · 4023 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

零、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项目中自己写出一套异步获取数据的方法,并提供回调方法。

三、小结

希望在网络编程这方面能有长足的进步吧!


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:HNAer_RadAsm

查看原文:Go项目(一)、服务器数据拉取和Material Design风格

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4023 次点击  ∙  1 赞  
加入收藏 微博
上一篇:Go
下一篇:GoLang之协程
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传