分分鐘教你作出本身的新聞閱讀APPandroid
引子正則表達式
曾經不當心發現了一些好的看新聞的網站,可是電腦又不是隨身攜帶,所以想要下載一個這個網站的手機APP來看新聞,可是問題來了,這個網站根本沒有作Android端!你說用手機瀏覽器來看?天,有些網站用手機瀏覽器來看又會出現好些個問題,好比說:廣告太多,還有那使人厭惡的彈窗,更有些排版簡直讓人不忍直視有木有。所以,我萌生出一個本身打造一個新聞閱讀器的APP的想法,畢竟之前也玩過Android的開發,雖然是菜鳥級別的,可是作出一個手機新聞閱讀APP仍是難不倒個人~瀏覽器
工欲善其事,必先利其器框架
開發工具:安裝過Android插件的Eclipse。異步
必備jar包:jsoup-1.7.2.jar,(固然,其它版本也能夠)ide
必備知識:一點Android知識,一點HTML知識函數
技術原理工具
技術上來說毫無難點。具體實現步驟以下:開發工具
看的再多不如動手一試 網站
因爲快點看出效果,因此一切就從簡了。直接創建Android項目,創建空的Activity。而後在你的layout的 這個文件中加入一個按鈕。好比像這樣:
<Button android:id="@+id/button1" android:layout_width="150dip" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView1" android:layout_alignBottom="@+id/textView1" android:layout_alignLeft="@+id/button2" android:background="@drawable/button" android:text="Business Insider" />
而後在MainActivity裏的onCreateView函數里加入一個方法,讓它能點擊你剛剛添加的按鈕進入到下一個界面:
1 rootView.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 // TODO Auto-generated method stub 6 StartGeek(); 7 } 8 9 });
點擊按鈕會觸發事件,執行StartGeek的方法,而StartGeek的方法則是跳到下一個Activity,
1 private void StartGeek() { 2 // TODO Auto-generated method stub 3 Intent intent = new Intent(); 4 intent.setClass(this.getActivity(), GeekActivity.class); 5 startActivity(intent); 6 7 }
在這個Activity中,咱們將訪問網頁,並從中獲取HTML網頁的內容,而後進行解析,獲取新聞的標題以及連接,而後將新聞的標題顯示在手機屏幕上,代碼具體實現以下:
1 ListView listview; 2 Handler handler; 3 List<Map<String, Object>> data; 4 5 final String CSDNURL = "http://tech.qq.com/bi.htm";
首先是變量的聲明,至於變量名的問題請隨意吐槽,由於一直在嘗試拿各類網站的新聞內容,因此變量名是最初的,因爲懶就一直沒換-。 -,因爲新聞網站的內容較多,因此用ListView比較合適,這樣不會出現顯示不全的狀況。
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_geek); 5 handler = getHandler(); 6 ThreadStart(); 7 }
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 tools:context="${packageName}.${activityClass}" > 6 7 <ListView 8 android:id="@+id/listView" 9 android:layout_width="wrap_content" 10 android:layout_height="fill_parent" 11 ></ListView> 12 13 </RelativeLayout>
接下來是onCreate方法,這裏界面是activity_geek,而後調用兩個方法,因爲獲取數據費時,因此又起了一個線程,固然比較好的方法是用異步線程來作,那樣的話不只能夠不佔用主線程,並且還能夠很方便的加進度條什麼的,至關好用,至於我爲何不用,固然是不會用了撒~
1 private void ThreadStart() { 2 new Thread() { 3 public void run() { 4 Message msg = new Message(); 5 try { 6 data = getCsdnNetDate(); 7 msg.what = data.size(); 8 } catch (Exception e) { 9 e.printStackTrace(); 10 msg.what = -1; 11 } 12 handler.sendMessage(msg); 13 } 14 }.start(); 15 }
這是新的線程,用於從網址獲取咱們想要的HTML文件,並將其傳給handler處理。獲取的函數方法是:
1 data = getCsdnNetDate();
1 private List<Map<String, Object>> getCsdnNetDate() { 2 List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(); 3 Document doc = http_get(CSDNURL); 4 Elements links = doc.select("h3>a"); 5 for(Element link: links) 6 { 7 Map<String, Object> map = new HashMap<String, Object>(); 8 map.put("title", link.attr("title")); 9 map.put("url", link.attr("abs:href")); 10 result.add(map); 11 } 12 13 14 return result; 15 }
1 Document doc = http_get(CSDNURL);
1 private Document http_get(String url) { 2 Document doc=null; 3 try { 4 doc = Jsoup.connect(url) 5 .timeout(50000) 6 .get(); 7 } catch (IOException e) { 8 // TODO Auto-generated catch block 9 e.printStackTrace(); 10 } 11 12 return doc; 13 }
經過http_get方法中的Jsoup.connect來鏈接到網址,而後經過.get方法來得到HTML的文本信息,設定的鏈接時間是5S,獲取到這個文本信息以後Jsoup還帶有解析方法,經過link.attr("title")來獲取HTML中的<title>標籤中的標題,而後再經過link.attr("abs:href")來獲取新聞中的鏈
接,由此,咱們就得到了HTML中最爲重要的兩部分,也就是標題以及連接,事情到這裏已經完成大半了,接下來就是將標題顯示在當前頁面,而後點擊標題後,能將標題以及文中內容顯示在下個頁面,處理的方法以下:
1 private Handler getHandler() { 2 return new Handler(){ 3 public void handleMessage(Message msg) { 4 if (msg.what < 0) { 5 Toast.makeText(GeekActivity.this, "數據獲取失敗", Toast.LENGTH_SHORT).show(); 6 }else { 7 initListview(); 8 } 9 } 10 }; 11 }
此方法會判斷數據是否爲空,若爲空則在手機屏幕跳出:數據獲取失敗的字樣,固然了,喜歡什麼就改爲什麼,隨你所想~而後成功獲取數據則會進入到initListview方法:
1 private void initListview() { 2 listview = (ListView)findViewById(R.id.listView); 3 SimpleAdapter adapter = new SimpleAdapter(this, data, 4 android.R.layout.simple_list_item_1, new String[] { "title"}, 5 new int[] { android.R.id.text1 }); 6 listview.setAdapter(adapter); 7 8 9 listview.setOnItemClickListener(new OnItemClickListener() { 10 @Override 11 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 12 long arg3) { 13 Map<String, Object> map = data.get(arg2); 14 String url = (String)(map.get("url")); 15 String title = (String)(map.get("title")); 16 Intent intent = new Intent(); 17 intent.putExtra("url", url); 18 intent.putExtra("title", title); 19 intent.setClass(GeekActivity.this, ContentActivity.class); 20 startActivity(intent); 21 } 22 }); 23 }
這個方法會將獲取的新聞標題顯示在當前頁面上,而後將新聞的標題以及連接保存下來,經過intent傳到下一個Activity,也就是ContentActivity進行處理,並將標題以及內容顯示在下一個頁面中。代碼的分下以下:
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_content); 5 6 url = getIntent().getStringExtra("url"); 7 String title = getIntent().getStringExtra("title"); 8 TextView tv = (TextView)findViewById(R.id.title_content); 9 tv.setText(title); 10 handler = getHandler(); 11 ThreadStart(); 12 }
onCreate方法中獲取上個Activity中傳過來的url以及title,而後直接將新聞標題顯示在當前頁,而後剩餘部分和上個方法差不太多,鏈接到網上,獲取HTML內容,此次在方法中僅僅是解析的方法不一樣,畢竟此次解析是要獲取內容嘛~代碼以下:
1 private List<Map<String, Object>> getCsdnNetDate() { 2 List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(); 3 Document doc = http_get(url); 4 Elements links = doc.select("div#Cnt-Main-Article-QQ>p"); 5 for(Element link: links) 6 { 7 Map<String, Object> map = new HashMap<String, Object>(); 8 map.put("title", link.text()); 9 result.add(map); 10 } 11 12 13 return result; 14 }
標紅部分爲與上次不一樣的部分,這個解析都是用的Jsoup自帶的,固然正則表達式也是能夠作到的哦,咳咳,我認可我很懶的啊,有好用的工具就直接用了,省時省力的事幹嗎不用呢,就像寫網站有框架了天然就用了,不喜歡用的我也木有辦法,你可使用正則表達式來作,話說之前用
Python作爬蟲的時候就是正則表達式作的。
至此一個小的新聞的閱讀APP就出世了,哦,對了,不要忘了在你的配置文件加入Activity以及上網許可,否則的話是會閃退的哦。固然這個APP非常粗糙,有時間的人能夠將圖片也加上進行一下頁面的設計,作一下美工什麼的。
PS:本博客歡迎轉發,但請註明博客地址及做者~
博客地址:http://www.cnblogs.com/voidy/
<。)#)))≦