zoukankan      html  css  js  c++  java
  • ANDROID_MARS学习笔记_S01原始版_020_Mp3player001_歌曲列表

    一、项目设计

    二、歌曲列表简介

    1.利用java.net.HttpURLConnection以流的形式下载xml文件为String

    2.自定义ContentHandler--》Mp3ListContentHandler

    3.利用自定义的ContentHandler和javax.xml.parsers.SAXParserFactory生成org.xml.sax.XMLReader,用来处理下载的xml字符串,处理结果以List<Mp3Info>返回

    4.以返回的List<Mp3Info>和布局文件创建android.widget.SimpleAdapter

    5.最后在activity中调用setListAdapter(adapter),完成更新列表操作

    二、代码
    1.xml
    (1)main.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:orientation="vertical" android:layout_width="fill_parent"
     4     android:layout_height="fill_parent">
     5     <LinearLayout android:id="@+id/listLinearLayout"
     6         android:layout_width="fill_parent" android:layout_height="wrap_content"
     7         android:orientation="vertical">
     8         <ListView android:id="@id/android:list" android:layout_width="fill_parent"
     9             android:layout_height="wrap_content" android:drawSelectorOnTop="false"
    10             android:scrollbars="vertical" />
    11     </LinearLayout>
    12 </LinearLayout>

    (2)AndroidManifest.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="tony.mp3player"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6 
     7     <uses-sdk
     8         android:minSdkVersion="8"
     9         android:targetSdkVersion="21" />
    10 
    11     <application
    12         android:allowBackup="true"
    13         android:icon="@drawable/ic_launcher"
    14         android:label="@string/app_name"
    15         android:theme="@style/AppTheme" >
    16         <activity
    17             android:name=".Mp3ListActivity"
    18             android:label="@string/app_name" >
    19             <intent-filter>
    20                 <action android:name="android.intent.action.MAIN" />
    21 
    22                 <category android:name="android.intent.category.LAUNCHER" />
    23             </intent-filter>
    24         </activity>
    25     </application>
    26     <uses-permission android:name="android.permission.INTERNET"/>
    27 </manifest>

    3.mp3info_item.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="fill_parent"
     4     android:layout_height="fill_parent"
     5     android:orientation="horizontal"
     6     android:paddingLeft="10dip"
     7     android:paddingRight="10dip"
     8     android:paddingTop="1dip"
     9     android:paddingBottom="1dip"
    10     >
    11     <TextView android:id="@+id/mp3Name"
    12     android:layout_height="30dip"
    13     android:layout_width="180dip"
    14     android:textSize="10pt"/>
    15     <TextView android:id="@+id/mp3Size"
    16     android:layout_height="30dip"
    17     android:layout_width="180dip"
    18     android:textSize="10pt"/>
    19 </LinearLayout>

    2.java
    (1)Mp3ListActivity.java

      1 package tony.mp3player;
      2 
      3 import java.io.IOException;
      4 import java.io.StringReader;
      5 import java.util.ArrayList;
      6 import java.util.HashMap;
      7 import java.util.Iterator;
      8 import java.util.List;
      9 import java.util.Map;
     10 
     11 import javax.xml.parsers.ParserConfigurationException;
     12 import javax.xml.parsers.SAXParserFactory;
     13 
     14 import org.xml.sax.InputSource;
     15 import org.xml.sax.SAXException;
     16 import org.xml.sax.XMLReader;
     17 
     18 import tony.download.HttpDownloader;
     19 import tony.model.Mp3Info;
     20 import tony.xml.Mp3ListContentHandler;
     21 import android.annotation.SuppressLint;
     22 import android.app.ListActivity;
     23 import android.os.Bundle;
     24 import android.os.StrictMode;
     25 import android.view.Menu;
     26 import android.view.MenuItem;
     27 import android.widget.SimpleAdapter;
     28 
     29 @SuppressLint("NewApi")
     30 public class Mp3ListActivity extends ListActivity {
     31     private static final int UPDATE = 1;
     32     private static final int ABOUT = 1;
     33     @Override
     34     protected void onCreate(Bundle savedInstanceState) {
     35         super.onCreate(savedInstanceState);
     36         setContentView(R.layout.main);
     37         if (android.os.Build.VERSION.SDK_INT > 9) {
     38             StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
     39             StrictMode.setThreadPolicy(policy);
     40         }
     41         updateListView();
     42     }
     43     
     44     /**
     45      * 在用点击MENU按钮之后,会调用该方法,我们可以在这个方法当中加入自己的按钮控件
     46      */
     47     @Override
     48     public boolean onCreateOptionsMenu(Menu menu) {
     49         menu.add(0, UPDATE, UPDATE, R.string.mp3list_update);
     50         menu.add(0, ABOUT, ABOUT, R.string.mp3list_about);
     51         return super.onCreateOptionsMenu(menu);
     52     }
     53     
     54     /**
     55      * 当菜单选项被选中时调用
     56      */
     57     @Override
     58     public boolean onOptionsItemSelected(MenuItem item) {
     59         System.out.println("onOptionsItemSelected--->ItemId="+item.getItemId());
     60         switch (item.getItemId()) {
     61         case UPDATE:
     62             updateListView();
     63             break;
     64         case 2:
     65             break;
     66         default:
     67             break;
     68         }
     69         return super.onOptionsItemSelected(item);
     70     }
     71     
     72     private void updateListView() {
     73         String xml = downloadXML("http://192.168.1.104:8080/mp3/resources.xml");
     74         List<Mp3Info> infos = parse(xml);
     75         SimpleAdapter adapter = buidSimpleAdapter(infos);
     76         setListAdapter(adapter);
     77     }
     78 
     79     private SimpleAdapter buidSimpleAdapter(List<Mp3Info> infos) {
     80         // 生成一个List对象,并按照SimpleAdapter的标准,将mp3Infos当中的数据添加到List当中去
     81         List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
     82         HashMap<String,String> map = null;
     83         Mp3Info info = null;
     84         for(Iterator it = infos.iterator() ; it.hasNext() ;) {
     85             info = (Mp3Info) it.next();
     86             map = new HashMap<String,String>();
     87             map.put("mp3Name", info.getMp3Name());
     88             map.put("mp3Size", info.getMp3Size());
     89             list.add(map);
     90         }
     91         SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.mp3info_item, 
     92                 new String[]{"mp3Name", "mp3Size"}, new int[]{R.id.mp3Name, R.id.mp3Size});
     93         return adapter;
     94     }
     95 
     96     private String downloadXML(String urlStr) {
     97         HttpDownloader httpDownloader = new HttpDownloader();
     98         String result = httpDownloader.download(urlStr);
     99         return result;
    100     }
    101     
    102     private List<Mp3Info> parse(String xml) {
    103         SAXParserFactory spf =  SAXParserFactory.newInstance();
    104         List<Mp3Info> infos = new ArrayList<Mp3Info>();
    105         try {
    106             XMLReader reader = spf.newSAXParser().getXMLReader();
    107             Mp3ListContentHandler handler = new Mp3ListContentHandler(infos);
    108             reader.setContentHandler(handler);
    109             reader.parse(new InputSource(new StringReader(xml)));
    110             for(Iterator it = infos.iterator();it.hasNext();) {
    111                 Mp3Info info = (Mp3Info) it.next();
    112                 System.out.println(info);
    113             }
    114         } catch (SAXException e) {
    115             e.printStackTrace();
    116         } catch (ParserConfigurationException e) {
    117             e.printStackTrace();
    118         } catch (IOException e) {
    119             e.printStackTrace();
    120         }
    121         return infos;
    122     }
    123 }

    (2)Mp3ListContentHandler.java

     1 package tony.xml;
     2 
     3 import java.util.List;
     4 
     5 import org.xml.sax.Attributes;
     6 import org.xml.sax.SAXException;
     7 import org.xml.sax.helpers.DefaultHandler;
     8 
     9 import tony.model.Mp3Info;
    10 
    11 public class Mp3ListContentHandler extends DefaultHandler {
    12 
    13     private List<Mp3Info> infos = null;
    14     private Mp3Info mp3Info = null;
    15     private String tagName = null;
    16 
    17     public Mp3ListContentHandler(List<Mp3Info> infos) {
    18         super();
    19         this.infos = infos;
    20     }
    21 
    22     @Override
    23     public void startDocument() throws SAXException {
    24         super.startDocument();
    25     }
    26 
    27     @Override
    28     public void endDocument() throws SAXException {
    29         super.endDocument();
    30     }
    31 
    32     @Override
    33     public void startElement(String uri, String localName, String qName,
    34             Attributes attributes) throws SAXException {
    35         this.tagName = localName;
    36         if(tagName.equals("resource")) {
    37             mp3Info = new Mp3Info();
    38         }
    39     }
    40 
    41     @Override
    42     public void endElement(String uri, String localName, String qName)
    43             throws SAXException {
    44         if(qName.equals("resource")) {
    45             infos.add(mp3Info);
    46         }
    47         tagName = "";
    48     }
    49 
    50     @Override
    51     public void characters(char[] ch, int start, int length)
    52             throws SAXException {
    53         String temp = new String(ch, start, length);
    54         if(tagName.equals("id")) 
    55             mp3Info.setId(temp);
    56         else if(tagName.equals("mp3.name"))
    57             mp3Info.setMp3Name(temp);
    58         else if(tagName.equals("mp3.size"))
    59             mp3Info.setMp3Size(temp);
    60         else if(tagName.equals("lrc.name"))
    61             mp3Info.setLrcName(temp);
    62         else if(tagName.equals("lrc.size"))
    63             mp3Info.setLrcSize(temp);
    64     }
    65 }

    (3)HttpDownloader.java

     1 package tony.download;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.InputStreamReader;
     5 import java.net.HttpURLConnection;
     6 import java.net.URL;
     7 
     8 public class HttpDownloader {
     9 
    10     /**
    11      * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容
    12      * 1.创建一个URL对象
    13      * 2.通过URL对象,创建一个HttpURLConnection对象
    14      * 3.得到InputStram
    15      * 4.从InputStream当中读取数据
    16      * @param urlStr
    17      * @return
    18      */
    19     public String download(String urlStr) {
    20         StringBuffer sb = new StringBuffer();
    21         String line = null;
    22         BufferedReader buffer = null;
    23         try {
    24             // 创建一个URL对象
    25             URL url = new URL(urlStr);
    26             // 创建一个Http连接
    27             HttpURLConnection urlConn = (HttpURLConnection) url
    28                     .openConnection();
    29             // 使用IO流读取数据
    30             buffer = new BufferedReader(new InputStreamReader(urlConn
    31                     .getInputStream()));
    32             while ((line = buffer.readLine()) != null) {
    33                 sb.append(line);
    34             }
    35         } catch (Exception e) {
    36             e.printStackTrace();
    37         } finally {
    38             try {
    39                 buffer.close();
    40             } catch (Exception e) {
    41                 e.printStackTrace();
    42             }
    43         }
    44         return sb.toString();
    45     }
    46 }

    (4)

     1 package tony.model;
     2 
     3 public class Mp3Info {
     4 
     5     private String id,mp3Name,mp3Size,lrcName,lrcSize;
     6 
     7     public Mp3Info() {
     8         super();
     9     }
    10 
    11     public Mp3Info(String id, String mp3Name, String mp3Size, String lrcName,
    12             String lrcSize) {
    13         super();
    14         this.id = id;
    15         this.mp3Name = mp3Name;
    16         this.mp3Size = mp3Size;
    17         this.lrcName = lrcName;
    18         this.lrcSize = lrcSize;
    19     }
    20 
    21     @Override
    22     public String toString() {
    23         return "Mp3Info [id=" + id + ", mp3Name=" + mp3Name + ", mp3Size="
    24                 + mp3Size + ", lrcName=" + lrcName + ", lrcSize=" + lrcSize
    25                 + "]";
    26     }
    27 
    28     public String getId() {
    29         return id;
    30     }
    31 
    32     public void setId(String id) {
    33         this.id = id;
    34     }
    35 
    36     public String getMp3Name() {
    37         return mp3Name;
    38     }
    39 
    40     public void setMp3Name(String mp3Name) {
    41         this.mp3Name = mp3Name;
    42     }
    43 
    44     public String getMp3Size() {
    45         return mp3Size;
    46     }
    47 
    48     public void setMp3Size(String mp3Size) {
    49         this.mp3Size = mp3Size;
    50     }
    51 
    52     public String getLrcName() {
    53         return lrcName;
    54     }
    55 
    56     public void setLrcName(String lrcName) {
    57         this.lrcName = lrcName;
    58     }
    59 
    60     public String getLrcSize() {
    61         return lrcSize;
    62     }
    63 
    64     public void setLrcSize(String lrcSize) {
    65         this.lrcSize = lrcSize;
    66     }
    67     
    68     
    69 }

    四、运行结果

  • 相关阅读:
    rpm常见命令使用说明
    终端传值给Makefile、Makefile传值给C++代码
    redis实现异步队列
    redis实现分布式锁
    正则表达式
    nginx安装
    metaq
    zeromq
    ActiveMq
    http压力测试
  • 原文地址:https://www.cnblogs.com/shamgod/p/5194530.html
Copyright © 2011-2022 走看看