Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android開發筆記之網絡編程—簡易新聞客戶端

android開發筆記之網絡編程—簡易新聞客戶端

編輯:關於Android編程

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

那先來看一個組件—->智能圖片加載器(smart-image-view),它可以很方便的加載一張網絡圖片。

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

支持通過URL來加載圖片;

支持從電話簿中加載圖片;

異步加載圖片;

圖片被緩存在內存,以便下次快速加載顯示;

SmartImageView類可以被很容易擴展成對其它資源的調用;

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

①將智能圖片加載器的jar包或者源碼下載下來。

jar包下載地址:android-smart-image-view-1.0.0.jar

②在xml布局文件中添加一個控件

③獲取引用

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



    
        今天下午,中紀委通報安徽省副省長楊振超落馬,安徽是今年中央巡視組“回頭看”的四省份之一
        15687
        http://192.168.30.1:8089/images/6.jpg
    
    
        凶手是死者同事,維護死者代碼時完全看不懂而痛下殺手
        16359
        http://192.168.30.1:8089/images/7.jpg
    
    
        凶手是一名程序員,因死者對項目需求頻繁改動而痛下殺手
        14112
        http://192.168.30.1:8089/images/7.jpg
    
    
        最高法駁回360上訴, 維持一審宣判.
        6427
        http://192.168.30.1:8089/images/1.jpg
    
    
        市民: 因霧霾起訴環保局; 公務員談"緊日子": 堅決不出去.
        681
        http://192.168.30.1:8089/images/2.jpg
    
    
        外文局: 國際民眾認可中國大國地位;法院: "流量清零"未侵權.
        1359
        http://192.168.30.1:8089/images/3.jpg
    
    
        放假時我醒了不代表我起床了, 如今我起床了不代表我醒了!
        11616
        http://192.168.30.1:8089/images/4.jpg
    
    
        "媽, 我在東莞被抓, 要2萬保釋金, 快匯錢到xxx!"
        10339
        http://192.168.30.1:8089/images/5.jpg
    
    
        少壯不努力,老大做IT
        14612
        http://192.168.30.1:8089/images/8.jpg
    
    
        問君能有幾多愁,恰似調完代碼改需求
        13230
        http://192.168.30.1:8089/images/8.jpg
    
    
        覺得我帥的人工資一般都比較高
        9928
        http://192.168.30.1:8089/images/8.jpg
    
    
        市民: 因霧霾起訴環保局; 公務員談"緊日子": 堅決不出去.
        681
        http://192.168.30.1:8089/images/2.jpg
    


如果你下載下來進行測試的話,請記得將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();
                    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上。

④添加網絡權限

public class NewsAdapter extends CommonAdapter{

    public NewsAdapter(Context context, List 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解析的文章,我這裡就不多說了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved