Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發一個簡單的手機博客客戶端的實例

Android開發一個簡單的手機博客客戶端的實例

編輯:Android開發實例

 實現一個簡單的手機博客客戶端的開發

本程序暫時實現以下的功能:

1、首先實現一個去服務器獲取一串xml的數據,然後顯示到界面上

2、點擊圖片可以放大查看

最終效果如下:

 

1、首先把界面寫出來,使用listView

 

  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="vertical" > 
  6.  
  7.     <ListView 
  8.          
  9.         android:id="@+id/blogLV" 
  10.         android:layout_width="fill_parent" 
  11.         android:layout_height="fill_parent" 
  12.          
  13.          > 
  14.     </ListView> 
  15.      
  16. </LinearLayout> 

2.item的界面

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="match_parent" 
  4.     android:layout_height="match_parent" 
  5.     android:orientation="horizontal" > 
  6.  
  7.     <ImageView 
  8.         android:id="@+id/portraitIV" 
  9.         android:layout_width="50dp" 
  10.         android:layout_height="50dp" 
  11.          
  12.          /> 
  13.  
  14.     <LinearLayout 
  15.         android:layout_width="match_parent" 
  16.         android:layout_height="wrap_content" 
  17.         android:orientation="vertical" 
  18.         android:padding="5dp" > 
  19.  
  20.         <TextView 
  21.             android:id="@+id/nameTV" 
  22.             android:layout_width="wrap_content" 
  23.             android:layout_height="wrap_content" 
  24.             android:layout_margin="2dp" 
  25.             android:text="姓名" 
  26.             android:textSize="20sp" /> 
  27.  
  28.         <TextView 
  29.             android:id="@+id/contentTV" 
  30.             android:layout_width="wrap_content" 
  31.             android:layout_height="wrap_content" 
  32.             android:layout_margin="2dp" 
  33.             android:textSize="15sp" /> 
  34.  
  35.         <ImageView 
  36.             android:id="@+id/picIV" 
  37.             android:layout_width="wrap_content" 
  38.             android:layout_height="wrap_content" 
  39.             android:layout_margin="2dp" 
  40.             android:adjustViewBounds="true" 
  41.             android:maxHeight="100dp" 
  42.             android:maxWidth="100dp" /> 
  43.  
  44.         <TextView 
  45.             android:id="@+id/fromTV" 
  46.             android:layout_width="wrap_content" 
  47.             android:layout_height="wrap_content" 
  48.             android:layout_margin="2dp" 
  49.             android:textColor="#55FFFFFF" 
  50.             android:text="來自新浪博客" 
  51.             android:textSize="15sp" /> 
  52.     </LinearLayout> 
  53.  
  54. </LinearLayout> 

3、步入正題blog.java

 

  1. package cn.itcast.blog; 
  2.  
  3. public class Blog { 
  4.  
  5.     private String portrait; 
  6.     private String name; 
  7.     private String content; 
  8.     private String pic; 
  9.     private String from; 
  10.      
  11.      
  12.     public Blog() { 
  13.         super(); 
  14.     } 
  15.      
  16.     public Blog(String portrait, String name, String content, String pic, 
  17.             String from) { 
  18.         super(); 
  19.         this.portrait = portrait; 
  20.         this.name = name; 
  21.         this.content = content; 
  22.         this.pic = pic; 
  23.         this.from = from; 
  24.     } 
  25.     public String getPortrait() { 
  26.         return portrait; 
  27.     } 
  28.     public void setPortrait(String portrait) { 
  29.         this.portrait = portrait; 
  30.     } 
  31.     public String getName() { 
  32.         return name; 
  33.     } 
  34.     public void setName(String name) { 
  35.         this.name = name; 
  36.     } 
  37.     public String getContent() { 
  38.         return content; 
  39.     } 
  40.     public void setContent(String content) { 
  41.         this.content = content; 
  42.     } 
  43.     public String getPic() { 
  44.         return pic; 
  45.     } 
  46.     public void setPic(String pic) { 
  47.         this.pic = pic; 
  48.     } 
  49.     public String getFrom() { 
  50.         return from; 
  51.     } 
  52.     public void setFrom(String from) { 
  53.         this.from = from; 
  54.     } 
  55.      
  56.     @Override 
  57.     public String toString() { 
  58.         return "Blog [portrait=" + portrait + ", name=" + name + ", content=" 
  59.                 + content + ", pic=" + pic + ", from=" + from + "]"; 
  60.     } 
  61.      

4.主界面mainActivity

 

  1. package cn.itcast.blog; 
  2.  
  3. import java.util.List; 
  4.  
  5. import android.app.Activity; 
  6. import android.content.Intent; 
  7. import android.net.Uri; 
  8. import android.os.Bundle; 
  9. import android.view.View; 
  10. import android.view.View.OnClickListener; 
  11. import android.view.ViewGroup; 
  12. import android.widget.BaseAdapter; 
  13. import android.widget.ImageView; 
  14. import android.widget.ListView; 
  15. import android.widget.TextView; 
  16. import android.widget.Toast; 
  17.  
  18. public class mainActivity extends Activity { 
  19.     private ListView blogLV; 
  20.     private List<Blog> blogs; 
  21.     private ImageService imageService; 
  22.     /** Called when the activity is first created. */ 
  23.     @Override 
  24.     public void onCreate(Bundle savedInstanceState) { 
  25.         super.onCreate(savedInstanceState); 
  26.         setContentView(R.layout.main); 
  27.          
  28.         try { 
  29.             imageService = new ImageService(getApplicationContext()); // 圖片業務類 
  30.             BlogService blogservice=new BlogService(); // 博客業務類 
  31.             blogs = blogservice.getBlogs();        // 獲取博客數據 
  32.             blogLV = (ListView) this.findViewById(R.id.blogLV); // 獲取ListView 
  33.             blogLV.setAdapter(adapter);   //設置適配器,構建界面 
  34.         } catch (Exception e) { 
  35.             // TODO Auto-generated catch block 
  36.             e.printStackTrace(); 
  37.             Toast.makeText(this, "服務器忙", 0).show(); 
  38.         } 
  39.     } 
  40.      
  41.     //創建出來一個adapter,構建出了一個界面 
  42.     private BaseAdapter adapter=new BaseAdapter() { 
  43.          
  44.         @Override 
  45.         public View getView(int position, View convertView, ViewGroup parent) { 
  46.              
  47.             //用blog中的數據來替換view中的數據 
  48.             View view =convertView==null?View.inflate(getApplicationContext(), R.layout.item, null):convertView; 
  49.             ImageView  portraitIV  = (ImageView) view.findViewById(R.id.portraitIV); 
  50.             TextView nameTV = (TextView) view.findViewById(R.id.nameTV); 
  51.             TextView contentTV = (TextView) view.findViewById(R.id.contentTV); 
  52.             ImageView picIV = (ImageView) view.findViewById(R.id.picIV); 
  53.             TextView fromTV = (TextView) view.findViewById(R.id.fromTV); 
  54.              
  55.             final Blog blog = blogs.get(position);        // 獲取指定位置上的博客 
  56.             nameTV.setText(blog.getName());                // 設置文本數據 
  57.             contentTV.setText(blog.getContent()); 
  58.             fromTV.setText(blog.getFrom()); 
  59.             //設置圖片資源的顯示位置 
  60.              
  61.             try { 
  62.                 portraitIV.setImageBitmap(imageService.getImage(blog.getPortrait()));    // 根據地址獲取圖片, 設置圖片 
  63.             } catch (Exception e) { 
  64.                 e.printStackTrace(); 
  65.             } 
  66.              
  67.              
  68.              
  69.             //設置一個功能是實現圖片點擊放大的功能 
  70.             try { 
  71.                 picIV.setImageBitmap(imageService.getImage(blog.getPic())); 
  72.                 picIV.setOnClickListener(new OnClickListener() {//創建一個匿名內部類 
  73.                      
  74.                     public void onClick(View v) { 
  75.                         Intent intent=new Intent();//注冊一個意圖 
  76.                         intent.setAction(Intent.ACTION_VIEW); 
  77.                         intent.setData(Uri.parse(blog.getPic()));//解析一個地址 
  78.                         startActivity(intent); 
  79.                     } 
  80.                 }); 
  81.             } catch (Exception e) { 
  82.                 e.printStackTrace(); 
  83.             } 
  84.             return view; 
  85.         } 
  86.          
  87.         @Override 
  88.         public long getItemId(int position) { 
  89.             // TODO Auto-generated method stub 
  90.             return 0; 
  91.         } 
  92.          
  93.         @Override 
  94.         public Object getItem(int position) { 
  95.             // TODO Auto-generated method stub 
  96.             return null; 
  97.         } 
  98.          
  99.         @Override 
  100.         public int getCount() { 
  101.             // TODO Auto-generated method stub 
  102.             return blogs.size();//這個要返回一個blogs的長度 
  103.         } 
  104.     }; 
  105.      

5.

imageService

 

  1. package cn.itcast.blog; 
  2.  
  3. import java.io.File; 
  4. import java.io.FileOutputStream; 
  5. import java.net.HttpURLConnection; 
  6. import java.net.URL; 
  7. import java.net.URLEncoder; 
  8.  
  9. import android.accounts.NetworkErrorException; 
  10. import android.content.Context; 
  11. import android.graphics.Bitmap; 
  12. import android.graphics.Bitmap.CompressFormat; 
  13. import android.graphics.BitmapFactory; 
  14.  
  15. public class ImageService { 
  16.     private Context context; 
  17.  
  18.     // 創造它的構造函數 
  19.     public ImageService(Context context) { 
  20.         this.context = context; 
  21.     } 
  22.  
  23.     // 寫一個獲取圖片的方法 
  24.     public  Bitmap getImage(String address) throws Exception { 
  25.         // 1.判斷是否有圖片的資源,如果沒有的話直接返回空 
  26.         if (address == null) 
  27.             return null; 
  28.  
  29.         // 2、獲得地址,然後打開連接 
  30.         URL url = new URL(address); 
  31.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 獲得連接對象 
  32.                                                                             // ,然後打開連接 
  33.         conn.setConnectTimeout(3000);// 設置超時時間 
  34.  
  35.         // 8、緩存文件 
  36.         File cacheFile = new File(context.getCacheDir(), 
  37.                 URLEncoder.encode(address));// 緩存文件 
  38.         if (cacheFile.exists())// 9、判斷是否有緩存文件存在 
  39.             conn.setIfModifiedSince(cacheFile.lastModified());// 10、發送緩存文件的最後修改時間 
  40.  
  41.         // 3、獲得狀態碼,判斷是否為緩存文件 
  42.         int code = conn.getResponseCode();// 獲得狀態碼 
  43.         if (code == 200) { // 4.如果請求成功,那麼就開始讀取網路數據 
  44.             byte[] data = Util.read(conn.getInputStream()); 
  45.             // 5、使用BitmapFactory方法把讀取到的字符轉化為圖片 
  46.             Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length); 
  47.             writeCache(cacheFile, bm); // 6、開啟新線程,寫出圖片到本地。 
  48.             return bm; 
  49.         } else if (code == 304) { 
  50.             // 7、讀取本地數據,轉化為圖片 
  51.             return BitmapFactory.decodeFile(cacheFile.getAbsolutePath()); 
  52.         } 
  53.         throw new NetworkErrorException("訪問服務器出錯:" + code); 
  54.     } 
  55.  
  56.     // 開啟新線程來寫圖片緩存 
  57.     private void writeCache(final File cacheFile, final Bitmap bm) { 
  58.         // 開啟新線程 
  59.         new Thread() { 
  60.             public void run() { 
  61.                 try { 
  62.                     FileOutputStream fos = new FileOutputStream(cacheFile); 
  63.                     bm.compress(CompressFormat.JPEG, 100, fos);// 轉存到本地 
  64.                     fos.close(); 
  65.                 } catch (Exception e) { 
  66.                     // TODO Auto-generated catch block 
  67.                     e.printStackTrace(); 
  68.                     throw new RuntimeException(e); 
  69.                 } 
  70.             }; 
  71.         }.start(); 
  72.     } 

6.blogService

 

  1. package cn.itcast.blog; 
  2.  
  3. import java.io.InputStream; 
  4. import java.net.HttpURLConnection; 
  5. import java.net.URL; 
  6. import java.util.ArrayList; 
  7. import java.util.List; 
  8.  
  9. import org.xmlpull.v1.XmlPullParser; 
  10.  
  11. import android.accounts.NetworkErrorException; 
  12. import android.util.Xml; 
  13.  
  14. public class BlogService { 
  15.      
  16.     public List<Blog> getBlogs() throws Exception{//業務類把錯誤拋出去 
  17.         URL url=new URL("http://192.168.1.126/Myweb/blogs.xml");                //1、指定服務端地址 
  18.         HttpURLConnection conn=(HttpURLConnection) url.openConnection();      //2、打開連接對象 
  19.         conn.setConnectTimeout(3000);//設置超時時間為3秒   3、設置超時時間 
  20.          
  21.         //下一步開始判斷返回值 
  22.         int code=conn.getResponseCode();         //4、從服務端讀取數據,解析xml 
  23.         if(code==200){ 
  24.             //創建一個方法,通過輸入流來解析xml 
  25.             return parseBlog(conn.getInputStream()); 
  26.              
  27.         } 
  28.         throw new NetworkErrorException("連接失敗:"+code); 
  29.          
  30.     } 
  31.     //解析xml對象 
  32.     private List<Blog> parseBlog(InputStream inputStream) throws Exception { 
  33.         // TODO Auto-generated method stub 
  34.         XmlPullParser parser=Xml.newPullParser(); 
  35.         parser.setInput(inputStream, "UTF-8"); 
  36.          
  37.         List<Blog> blogs=new ArrayList<Blog>(); 
  38.         Blog blog=null; 
  39.         //解析xml文件 
  40.         for(int type=parser.getEventType();type!=XmlPullParser.END_DOCUMENT;type=parser.next()){ 
  41.             //解析 
  42.             if(type==XmlPullParser.START_TAG){ 
  43.                 if("blog".equals(parser.getName())){ 
  44.                     blog=new Blog();//如果是它我就創建對象,然後放進去 
  45.                     blogs.add(blog); 
  46.                      
  47.                 }else if("portrait".equals(parser.getName())){ 
  48.                     blog.setPortrait(parser.nextText()); 
  49.                 }else if("name".equals(parser.getName())){ 
  50.                     blog.setName(parser.nextText()); 
  51.                      
  52.                 }else if("content".equals(parser.getName())){ 
  53.                     blog.setContent(parser.nextText()); 
  54.                 }else if("pic".equals(parser.getName())){ 
  55.                     blog.setPic(parser.nextText()); 
  56.                 }else if("from".equals(parser.getName())){ 
  57.                     blog.setFrom(parser.nextText()); 
  58.                 } 
  59.                  
  60.             } 
  61.              
  62.         } 
  63.         return blogs;//如果xml裡面什麼都沒有 ,那麼就返回blog 
  64.     } 
  65.      

7.util

 

  1. package cn.itcast.blog; 
  2.  
  3. import java.io.ByteArrayOutputStream; 
  4. import java.io.IOException; 
  5. import java.io.InputStream; 
  6.  
  7. public class Util { 
  8.  
  9.     public static byte[] read(InputStream in) throws IOException { 
  10.         ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  11.         byte[] buffer = new byte[1024]; 
  12.         int len; 
  13.         while ((len = in.read(buffer)) != -1) 
  14.             baos.write(buffer, 0, len); 
  15.         baos.close(); 
  16.         byte[] data = baos.toByteArray(); 
  17.         return data; 
  18.     } 
  19.      

8.附件:服務器上的xml解析文件

 

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <blogs> 
  3.     <blog> 
  4.         <portrait>http://192.168.1.126/Myweb/b1.jpg</portrait> 
  5.         <name>QQ音樂</name> 
  6.         <content>問自己一個問題:既然1+22=2+1,那麼是否 I love youyou=you love me?</content> 
  7.         <pic>http://192.168.1.126/Myweb/b2.jpg</pic>  
  8.         <from>來自 QQ空間說說</from> 
  9.     </blog> 
  10.     <blog> 
  11.         <portrait>http://192.168.1.126/Myweb/portrait2.jpeg</portrait> 
  12.         <name>江南小丑</name> 
  13.         <content>為什麼總感覺還會再見到你? 既然走了為什麼再回來? </content> 
  14.         <from>來自 QQ空間說說</from> 
  15.     </blog> 
  16.     <blog> 
  17.         <portrait>http://192.168.1.126/Myweb/portrait3.jpeg</portrait> 
  18.         <name>美食廣場</name> 
  19.         <content>好誘人的美食哦,你要不要嘗嘗?</content> 
  20.         <pic>http://192.168.1.126/Myweb/content1.jpeg</pic> 
  21.         <from>來自 騰訊微博</from> 
  22.     </blog> 
  23.     <blog> 
  24.         <portrait>http://192.168.1.126/Myweb/portrait1.jpeg</portrait> 
  25.         <name>蔣坤</name> 
  26.         <content>好像雙系統不那麼好Ghost啊!</content> 
  27.         <from>來自 QQ空間說說</from> 
  28.     </blog> 
  29.     <blog> 
  30.         <portrait>http://192.168.1.126/Myweb/portrait2.jpeg</portrait> 
  31.         <name>蔓珠莎華</name> 
  32.         <content>為什麼總感覺還會再見到你? 既然走了為什麼再回來? </content> 
  33.         <from>來自 QQ空間說說</from> 
  34.     </blog> 
  35.     <blog> 
  36.         <portrait>http://192.168.1.126/Myweb/portrait3.jpeg</portrait> 
  37.         <name>各種誘惑美食</name> 
  38.         <content>宮廷桂花糕, 好正點!!</content> 
  39.         <pic>http://192.168.1.126/Myweb/content1.jpeg</pic> 
  40.         <from>來自 騰訊微博</from> 
  41.     </blog> 
  42. </blogs> 

 

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