1. 程式人生 > >android開發筆記之網路程式設計—簡易新聞客戶端

android開發筆記之網路程式設計—簡易新聞客戶端

今天我們來對前面講過的知識綜合運用一下,包括xml的PULL解析,listView的萬能介面卡等知識。。。。

那先來看一個元件—->智慧圖片載入器(smart-image-view),它可以很方便的載入一張網路圖片。

SmartImageView的設計初衷是來取代Android自帶的ImgageView元件,另外它還提供了一些附加功能,如:

支援通過URL來載入圖片;

支援從電話簿中載入圖片;

非同步載入圖片;

圖片被快取在記憶體,以便下次快速載入顯示;

SmartImageView類可以被很容易擴充套件成對其它資源的呼叫;

而且使用起來非常簡單,使用步驟:

①將智慧圖片載入器的jar包或者原始碼下載下來。

②在xml佈局檔案中新增一個控制元件

<com.loopj.android.image.SmartImageView android:id="@+id/my_image" />

③獲取引用

SmartImageView myImage = (SmartImageView)this.findViewById(R.id.my_image);

④獲取網路圖片

myImage.setImageUrl("http://www.awesomeimages.com/myawesomeimage.jpg");

注:

獲取網路圖片,這個過程本身就是非同步。不必再進行處理,也不必擔心執行緒阻塞

網路獲取到的圖片都進行了快取的處理。會在程式的cache目錄下建/web_image_cache/,圖片存在這裡

再次使用的時候,如果快取圖片已經存在,則不再從網路獲取圖片

先看.setImageUrl都有什麼方法

1、最普通的一個,直接設定圖片地址
// Helpers to set image by URL
public void setImageUrl(String url) {
setImage(new WebImage(url));
}

2、有一個介面,完成下載的時候呼叫
public void setImageUrl(String url, SmartImageTask.OnCompleteListener completeListener) {
setImage(new WebImage(url), completeListener);
}

3、從字面意思可以看出,是一個備用的資源。如果從網路獲取圖片失敗,則使用備用資源
public void setImageUrl(String url, final Integer fallbackResource) {
setImage(new WebImage(url), fallbackResource);
}

4、類似上面
public void setImageUrl(String url, final Integer fallbackResource, SmartImageTask.OnCompleteListener completeListener) {
setImage(new WebImage(url), fallbackResource, completeListener);
}

5、多了一個loadingResource,就是正在下載的時候展示的圖片
public void setImageUrl(String url, final Integer fallbackResource, final Integer loadingResource) {
setImage(new WebImage(url), fallbackResource, loadingResource);
}

6、類似上面
public void setImageUrl(String url, final Integer fallbackResource, final Integer loadingResource, SmartImageTask.OnCompleteListener completeListener) {
setImage(new WebImage(url), fallbackResource, loadingResource, completeListener);
}

接下來我們可以來製作我們的簡易新聞客戶端了。

效果:

這裡寫圖片描述

我們可以看到這是一個很簡單的新聞客戶端,沒錯,所以叫簡易的新聞,主要是為了綜合運用一下前面所講的東西。

下面開始分析:

①首先這個客戶端有兩個Activity,一個是新聞的列表,用一個ListView來裝,另外一個是詳情介面,只是將點選的新聞傳遞下去,沒有做太多。

那麼第一步就應該把資料獲取過來,現在只是測試一下,所以只是將新聞資料放在本地的伺服器上。這裡採用了HttpURLConnection的方式去想訪問伺服器。

URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(3000);
                    conn.setReadTimeout(3000);
                    conn.connect();
                    if (conn.getResponseCode() == 200) {
                         InputStream is = conn.getInputStream();
                         //使用PULL解析器解析這個流
                         parseNewsXml(is);
                    }else {
                        Message msg = Message.obtain();
                        msg.what = FAIL;
                        mHandler.sendMessage(msg);
                    }

②這裡伺服器返回的是xml檔案,所以我們應該對這個xml檔案進行解析。這裡選用PULL解析。

新聞資料:

news.xml

<?xml version="1.0" encoding="UTF-8" ?>
<newslist>
    <news>
        <title>安徽副省長羅馬</title>
        <detail>今天下午,中紀委通報安徽省副省長楊振超落馬,安徽是今年中央巡視組“回頭看”的四省份之一</detail>
        <comment>15687</comment>
        <image>http://192.168.30.1:8089/images/6.jpg</image>
    </news>
    <news>
        <title>程式設計師因寫程式碼太亂被殺害</title>
        <detail>凶手是死者同事,維護死者程式碼時完全看不懂而痛下殺手</detail>
        <comment>16359</comment>
        <image>http://192.168.30.1:8089/images/7.jpg</image>
    </news>
    <news>
        <title>產品經理因頻繁改需求被殺害</title>
        <detail>凶手是一名程式設計師,因死者對專案需求頻繁改動而痛下殺手</detail>
        <comment>14112</comment>
        <image>http://192.168.30.1:8089/images/7.jpg</image>
    </news>
    <news>
        <title>3Q大戰宣判: 騰訊獲賠500萬</title>
        <detail>最高法駁回360上訴, 維持一審宣判.</detail>
        <comment>6427</comment>
        <image>http://192.168.30.1:8089/images/1.jpg</image>
    </news>
    <news>
        <title>今日之聲:北大雕塑被戴口罩</title>
        <detail>市民: 因霧霾起訴環保局; 公務員談"緊日子": 堅決不出去.</detail>
        <comment>681</comment>
        <image>http://192.168.30.1:8089/images/2.jpg</image>
    </news>
    <news>
        <title>奧巴馬見達賴是裝蒜</title>
        <detail>外文局: 國際民眾認可中國大國地位;法院: "流量清零"未侵權.</detail>
        <comment>1359</comment>
        <image>http://192.168.30.1:8089/images/3.jpg</image>
    </news>
    <news>
        <title>輕鬆一刻: 我要沉迷學習不自拔</title>
        <detail>放假時我醒了不代表我起床了, 如今我起床了不代表我醒了!</detail>
        <comment>11616</comment>
        <image>http://192.168.30.1:8089/images/4.jpg</image>
    </news>
    <news>
        <title>男女那些事兒</title>
        <detail>"媽, 我在東莞被抓, 要2萬保釋金, 快匯錢到xxx!"</detail>
        <comment>10339</comment>
        <image>http://192.168.30.1:8089/images/5.jpg</image>
    </news>
    <news>
        <title>帥哥語錄一</title>
        <detail>少壯不努力,老大做IT</detail>
        <comment>14612</comment>
        <image>http://192.168.30.1:8089/images/8.jpg</image>
    </news>
    <news>
        <title>帥哥語錄二</title>
        <detail>問君能有幾多愁,恰似調完程式碼改需求</detail>
        <comment>13230</comment>
        <image>http://192.168.30.1:8089/images/8.jpg</image>
    </news>
    <news>
        <title>帥哥語錄三</title>
        <detail>覺得我帥的人工資一般都比較高</detail>
        <comment>9928</comment>
        <image>http://192.168.30.1:8089/images/8.jpg</image>
    </news>
    <news>
        <title>今日之聲:北大雕塑被戴口罩</title>
        <detail>市民: 因霧霾起訴環保局; 公務員談"緊日子": 堅決不出去.</detail>
        <comment>681</comment>
        <image>http://192.168.30.1:8089/images/2.jpg</image>
    </news>

</newslist>

如果你下載下來進行測試的話,請記得將xml檔案中的圖片標籤的ip地址改為自己本機的ip地址。

解析方法:

/**
     * 使用PULL解析
     * @param is 輸入流
     */
    protected void parseNewsXml(InputStream is) {
        XmlPullParser xp = Xml.newPullParser();
        try {
            //解析輸出流的位置
            xp.setInput(is, "utf-8");
            int eventType = xp.getEventType();
            while (eventType != XmlResourceParser.END_DOCUMENT) {
                switch (eventType) {
                case XmlResourceParser.START_DOCUMENT:
                    mNewsList = new ArrayList<News>();
                    break;
                case XmlResourceParser.START_TAG:
                    if ("news".equals(xp.getName())) {
                        news = new News();
                    }else if ("title".equals(xp.getName())) {
                        news.setTitle(xp.nextText());
                    }else if ("detail".equals(xp.getName())) {
                        news.setDetail(xp.nextText());
                    }else if ("comment".equals(xp.getName())) {
                        news.setComment(xp.nextText());
                    }else if ("image".equals(xp.getName())) {
                        news.setimageUrl(xp.nextText());
                    }
                    break;
                case XmlResourceParser.END_TAG:
                    if ("news".equals(xp.getName())) {
                        mNewsList.add(news);
                        news = null;
                    }
                    break;
                default:
                    break;
                }
                eventType = xp.next();
            }
            Message msg = Message.obtain();
            msg.what = SUCCESS;
            mHandler.sendMessage(msg);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

③使用萬能介面卡將新聞資料顯示在ListView上。

④新增網路許可權

<uses-permission android:name="android.permission.INTERNET" />
public class NewsAdapter extends CommonAdapter<News>{

    public NewsAdapter(Context context, List<News> data, int layoutId) {
        super(context, data, layoutId);
    }
    @Override
    public void current(ViewHolder holder, Object object) {
        News news = (News) object;
        ((TextView)holder.getView(R.id.tv_title)).setText(news.getTitle());
        ((TextView)holder.getView(R.id.tv_detail)).setText(news.getDetail());
        ((TextView)holder.getView(R.id.tv_comment)).setText(news.getComment() + "條評論");
        ((SmartImageView)holder.getView(R.id.siv)).setImageUrl(news.getimageUrl());
    }

}

大家如果看了我前面的文章,這個新聞客戶端應該就很簡單了,如果有不懂,請看我前面的萬能介面卡、PULL解析的文章,我這裡就不多說了。

相關推薦

android開發筆記網路程式設計簡易新聞客戶

今天我們來對前面講過的知識綜合運用一下,包括xml的PULL解析,listView的萬能介面卡等知識。。。。 那先來看一個元件—->智慧圖片載入器(smart-image-view),它可以很方便的載入一張網路圖片。 SmartImageView的設計

Java學習筆記--------網路程式設計Socket通訊----聊天室實現

Socket通訊 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。基於TCP/IP協議,建立穩定的點對點的通訊。 特點:實時、快速、安全性高、佔用系統資源多、效率低。 通常也稱作"套接字",套接字是一種程序間的資料交換機制。這些程序既可以在同一機

Java學習筆記--------網路程式設計InetAddress

java.net.InetAddress:此類表示網際網路協議 (IP) 地址。封裝計算機的IP地址和DNS,沒有埠。 getHostName():獲取此IP地址的主機名。 getHostAddress():返回IP地址字串(以文字表現形式)。 我們可以封裝埠: public cla

Java學習筆記--------網路程式設計的概念

什麼是計算機網路 把分佈在不同地理區域的計算機與專門的外部裝置用通訊線路互連成一個規模大、功能強的網路系統,從而使眾多的計算機可以方便地互相傳遞資訊,共享硬體、軟體、資料資訊等資源。 計算機網路的主要功能 資源共享 資訊傳輸與集中處理 均衡負荷與分佈處理 綜合資訊服務(www

Android開發筆記RecycleView載入不同item佈局的實現

RecycleView是安卓5.0版本以後推出的新控制元件 優點 想要控制其顯示的方式,請通過佈局管理器LayoutManager 想要控制Item間的間隔(可繪製),請通過ItemDecoration 想要控制Item增刪的動畫,請通過ItemAnima

Android開發筆記自定義控制元件(物流時間軸的實現)

最近修改專案遇到檢視物流這個需求,經過一個下午的時間的終於搞定,趁著這個時間點,趕快把這個功能抽取出來,方便大家以後開發的需要,幫助到更多的人 先看效果圖,如下 看完之後,分析可知道,主要是兩部分,一個頭部和一個body. 那我們最主要的工作就是bod

android開發筆記自定義開關按鈕

今天來講講自定義單個控制元件,就拿開關按鈕來講講,相信大家見了非常多這樣的了,先看看效果: 我們可以看到一個很常見的開關按鈕,那就來分析分析。 首先: 這是由兩張圖片構成: ①一張為有開和關的背景圖片 ②一張為控制開和關的滑動按鈕 第一步: 寫

Android開發筆記工具類使用靜態方法與單例物件方法的優劣

最近在做專案開發的時候用到了很多工具類,之前對工具類的理解僅限於使用靜態方法,沒有細究.寫了很多有損app執行效能的程式碼.例如在靜態方法內建立了例項物件,這樣讓靜態方法持有物件,使得物件一直存在與記憶體中,無法被GC回收,佔用記憶體,影響效能和使用者體驗

Android開發筆記notification訊息推送 通知欄的實現

訊息通知欄的實現我們要通過builder工廠來建立一個notification的物件我們建立一個點選了通知欄訊息要跳轉到的activityIntent intent = new Intent(conte

android開發筆記 Activity四種載入模式

既然是安卓開發,我們就免不了和Activity打交道,因為它是前臺的介面,也是android四大元件之一,那我們就來談談Activity的四種載入模式。 為什麼要為Activity指定載入模式? Android對Activity的管理,採用Task(即棧)來

Android開發筆記傳送小表情的實現

本部落格主要實現的是像QQ表情的傳送以及文字與表情的一起傳送 我們首先要明白QQ表情的傳送其實是一種特別的文字,也是文字的形式,所以我們需要將QQ表情轉化為特殊的文字形式 第一步我們先做一個資源工具類,如下所示 //我們把表情資源做成一個工具類 p

Android開發筆記gradle的buildTypes內部配置

buildTypes {         debug {             // 伺服器配置             buildConfig

基於TCP的socket套接字的網路程式設計客戶/服務模式)

於資料完整性要求較高的場合,就應採用TCP協議。 IP網路層提供IP定址和路由。因為在網路上資料可以經由多條線路到達目的地,網路層負責找出最佳的傳輸線路。 IP地址與資料包:   IP層就是把資料分組從一個主機跨越千山萬水搬運到另外一主機, 並且這搬運服務一點都不可靠, 丟包、

網路程式設計——udp客戶

#include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <arpa/inet.h> #include

網路程式設計客戶連結的合法性,socketserver模組

客戶端連結的合法性   驗證合法性:  首先,我們來探討一下,什麼叫驗證合法性, 舉個例子:有一天,我開了一個socket服務端,只想讓咱們這個班的同學使用,但是有一天,隔壁班的同學過來問了一下我開的這個服務端的ip和埠,然後他是不是就可以去連線我了啊,那怎麼辦,我是不是不想讓他連線我啊,我需要

ESP8266 -- lua開發學習路 五 (TCP客戶透傳)

透傳本人理解就是把串列埠接收的資料通過網路傳送給伺服器,  客戶端接收的資料通過串列埠再發送出去 ESP8266充當一個通道把網路資料與串列埠聯絡起來 init.lua檔案: --[[ init.lua檔案中不用做過多的操作初始化和載入檔案... ]] gpio.mode

java網路程式設計實現客戶連線伺服器,併發送訊息例子(1)。(阻塞式的方法)

昨天晚上學了網路執行緒,並寫了一個,客戶端連線伺服器的簡單例子,有點QQ的感覺,但是實際上還差遠,差不多就是很久之前那種“長江長江我是黃河”的通話形式。 程式碼如下: 伺服器端程式碼: imp

網路程式設計進行客戶和伺服器的連線

網路程式設計 自從網際網路誕生以來,現在基本上所有的程式都是網路程式,很少有單機版的程式了。計算機網路就是把各個計算機連線到一起,讓網路中的計算機可以互相通訊。網路程式設計就是如何在程式中實現兩臺計算機的通訊。網路程式設計對所有開發語言都是一樣的,Python也不例外。用Py

Android專案開發筆記登入註冊模組實現(客戶+服務

寫在前面   斷斷續續開發了幾個月的App終於告一段落,雖然它可能還很不完美,不過作為上手Android的第一個完整專案,確實從中學到了蠻多,所以開個系列記錄一下~本篇先從基本上每個App都會有的登入註冊講起,包含自動登入、記住密碼功能的實現=w= 實現

7.4 (java學習筆記網路程式設計TCP

一、TCP   1.1 TCP(Transmission Control Protocol 傳輸控制協議),是一種面向連線的,安全的傳輸協議,但效率相比於UDP而言比較低。   TCP傳輸時需要確保先建立連線之後,再進行傳輸這樣就保證了傳輸的可靠性。   java中將TCP封裝成了對應的類。