• android手机博客客户端开发


    实现一个简单的手机博客客户端的开发

    本程序暂时实现以下的功能:

    1、首先实现一个去服务器获取一串xml的数据,然后显示到界面上

    2、点击图片可以放大查看

    最终效果如下:

    image

    1、首先把界面写出来,使用listView

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <ListView
            
            android:id="@+id/blogLV"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            
             >
        </ListView>
        
    </LinearLayout>

    2.item的界面

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >
    
        <ImageView
            android:id="@+id/portraitIV"
            android:layout_width="50dp"
            android:layout_height="50dp"
            
             />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="5dp" >
    
            <TextView
                android:id="@+id/nameTV"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="2dp"
                android:text="姓名"
                android:textSize="20sp" />
    
            <TextView
                android:id="@+id/contentTV"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="2dp"
                android:textSize="15sp" />
    
            <ImageView
                android:id="@+id/picIV"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="2dp"
                android:adjustViewBounds="true"
                android:maxHeight="100dp"
                android:maxWidth="100dp" />
    
            <TextView
                android:id="@+id/fromTV"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="2dp"
                android:textColor="#55FFFFFF"
                android:text="来自新浪博客"
                android:textSize="15sp" />
        </LinearLayout>
    
    </LinearLayout>

    3、步入正题blog.java

    package cn.itcast.blog;
    
    public class Blog {
    
        private String portrait;
        private String name;
        private String content;
        private String pic;
        private String from;
        
        
        public Blog() {
            super();
        }
        
        public Blog(String portrait, String name, String content, String pic,
                String from) {
            super();
            this.portrait = portrait;
            this.name = name;
            this.content = content;
            this.pic = pic;
            this.from = from;
        }
        public String getPortrait() {
            return portrait;
        }
        public void setPortrait(String portrait) {
            this.portrait = portrait;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getContent() {
            return content;
        }
        public void setContent(String content) {
            this.content = content;
        }
        public String getPic() {
            return pic;
        }
        public void setPic(String pic) {
            this.pic = pic;
        }
        public String getFrom() {
            return from;
        }
        public void setFrom(String from) {
            this.from = from;
        }
        
        @Override
        public String toString() {
            return "Blog [portrait=" + portrait + ", name=" + name + ", content="
                    + content + ", pic=" + pic + ", from=" + from + "]";
        }
        
    }

    4.主界面mainActivity

    package cn.itcast.blog;
    
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class mainActivity extends Activity {
        private ListView blogLV;
        private List<Blog> blogs;
        private ImageService imageService;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            try {
                imageService = new ImageService(getApplicationContext()); // 图片业务类
                BlogService blogservice=new BlogService(); // 博客业务类
                blogs = blogservice.getBlogs();        // 获取博客数据
                blogLV = (ListView) this.findViewById(R.id.blogLV); // 获取ListView
                blogLV.setAdapter(adapter);   //设置适配器,构建界面
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Toast.makeText(this, "服务器忙", 0).show();
            }
        }
        
        //创建出来一个adapter,构建出了一个界面
        private BaseAdapter adapter=new BaseAdapter() {
            
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                
                //用blog中的数据来替换view中的数据
                View view =convertView==null?View.inflate(getApplicationContext(), R.layout.item, null):convertView;
                ImageView  portraitIV  = (ImageView) view.findViewById(R.id.portraitIV);
                TextView nameTV = (TextView) view.findViewById(R.id.nameTV);
                TextView contentTV = (TextView) view.findViewById(R.id.contentTV);
                ImageView picIV = (ImageView) view.findViewById(R.id.picIV);
                TextView fromTV = (TextView) view.findViewById(R.id.fromTV);
                
                final Blog blog = blogs.get(position);        // 获取指定位置上的博客
                nameTV.setText(blog.getName());                // 设置文本数据
                contentTV.setText(blog.getContent());
                fromTV.setText(blog.getFrom());
                //设置图片资源的显示位置
                
                try {
                    portraitIV.setImageBitmap(imageService.getImage(blog.getPortrait()));    // 根据地址获取图片, 设置图片
                } catch (Exception e) {
                    e.printStackTrace();
                }
                
                
                
                //设置一个功能是实现图片点击放大的功能
                try {
                    picIV.setImageBitmap(imageService.getImage(blog.getPic()));
                    picIV.setOnClickListener(new OnClickListener() {//创建一个匿名内部类
                        
                        public void onClick(View v) {
                            Intent intent=new Intent();//注册一个意图
                            intent.setAction(Intent.ACTION_VIEW);
                            intent.setData(Uri.parse(blog.getPic()));//解析一个地址
                            startActivity(intent);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return view;
            }
            
            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return 0;
            }
            
            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return null;
            }
            
            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return blogs.size();//这个要返回一个blogs的长度
            }
        };
        
    }

    5.

    imageService

    package cn.itcast.blog;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    
    import android.accounts.NetworkErrorException;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.CompressFormat;
    import android.graphics.BitmapFactory;
    
    public class ImageService {
        private Context context;
    
        // 创造它的构造函数
        public ImageService(Context context) {
            this.context = context;
        }
    
        // 写一个获取图片的方法
        public  Bitmap getImage(String address) throws Exception {
            // 1.判断是否有图片的资源,如果没有的话直接返回空
            if (address == null)
                return null;
    
            // 2、获得地址,然后打开连接
            URL url = new URL(address);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 获得连接对象
                                                                                // ,然后打开连接
            conn.setConnectTimeout(3000);// 设置超时时间
    
            // 8、缓存文件
            File cacheFile = new File(context.getCacheDir(),
                    URLEncoder.encode(address));// 缓存文件
            if (cacheFile.exists())// 9、判断是否有缓存文件存在
                conn.setIfModifiedSince(cacheFile.lastModified());// 10、发送缓存文件的最后修改时间
    
            // 3、获得状态码,判断是否为缓存文件
            int code = conn.getResponseCode();// 获得状态码
            if (code == 200) { // 4.如果请求成功,那么就开始读取网路数据
                byte[] data = Util.read(conn.getInputStream());
                // 5、使用BitmapFactory方法把读取到的字符转化为图片
                Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
                writeCache(cacheFile, bm); // 6、开启新线程,写出图片到本地。
                return bm;
            } else if (code == 304) {
                // 7、读取本地数据,转化为图片
                return BitmapFactory.decodeFile(cacheFile.getAbsolutePath());
            }
            throw new NetworkErrorException("访问服务器出错:" + code);
        }
    
        // 开启新线程来写图片缓存
        private void writeCache(final File cacheFile, final Bitmap bm) {
            // 开启新线程
            new Thread() {
                public void run() {
                    try {
                        FileOutputStream fos = new FileOutputStream(cacheFile);
                        bm.compress(CompressFormat.JPEG, 100, fos);// 转存到本地
                        fos.close();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        throw new RuntimeException(e);
                    }
                };
            }.start();
        }
    }

    6.blogService

    package cn.itcast.blog;
    
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlPullParser;
    
    import android.accounts.NetworkErrorException;
    import android.util.Xml;
    
    public class BlogService {
        
        public List<Blog> getBlogs() throws Exception{//业务类把错误抛出去
            URL url=new URL("http://192.168.1.126/Myweb/blogs.xml");                //1、指定服务端地址
            HttpURLConnection conn=(HttpURLConnection) url.openConnection();      //2、打开连接对象
            conn.setConnectTimeout(3000);//设置超时时间为3秒   3、设置超时时间
            
            //下一步开始判断返回值
            int code=conn.getResponseCode();         //4、从服务端读取数据,解析xml
            if(code==200){
                //创建一个方法,通过输入流来解析xml
                return parseBlog(conn.getInputStream());
                
            }
            throw new NetworkErrorException("连接失败:"+code);
            
        }
        //解析xml对象
        private List<Blog> parseBlog(InputStream inputStream) throws Exception {
            // TODO Auto-generated method stub
            XmlPullParser parser=Xml.newPullParser();
            parser.setInput(inputStream, "UTF-8");
            
            List<Blog> blogs=new ArrayList<Blog>();
            Blog blog=null;
            //解析xml文件
            for(int type=parser.getEventType();type!=XmlPullParser.END_DOCUMENT;type=parser.next()){
                //解析
                if(type==XmlPullParser.START_TAG){
                    if("blog".equals(parser.getName())){
                        blog=new Blog();//如果是它我就创建对象,然后放进去
                        blogs.add(blog);
                        
                    }else if("portrait".equals(parser.getName())){
                        blog.setPortrait(parser.nextText());
                    }else if("name".equals(parser.getName())){
                        blog.setName(parser.nextText());
                        
                    }else if("content".equals(parser.getName())){
                        blog.setContent(parser.nextText());
                    }else if("pic".equals(parser.getName())){
                        blog.setPic(parser.nextText());
                    }else if("from".equals(parser.getName())){
                        blog.setFrom(parser.nextText());
                    }
                    
                }
                
            }
            return blogs;//如果xml里面什么都没有 ,那么就返回blog
        }
        
    }

    7.util

    package cn.itcast.blog;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class Util {
    
        public static byte[] read(InputStream in) throws IOException {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = in.read(buffer)) != -1)
                baos.write(buffer, 0, len);
            baos.close();
            byte[] data = baos.toByteArray();
            return data;
        }
        
    }

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

    <?xml version="1.0" encoding="UTF-8"?>
    <blogs>
        <blog>
            <portrait>http://192.168.1.126/Myweb/b1.jpg</portrait>
            <name>QQ音乐</name>
            <content>问自己一个问题:既然1+2=2+1,那么是否 I love you=you love me?</content>
            <pic>http://192.168.1.126/Myweb/b2.jpg</pic> 
            <from>来自 QQ空间说说</from>
        </blog>
        <blog>
            <portrait>http://192.168.1.126/Myweb/portrait2.jpeg</portrait>
            <name>江南小丑</name>
            <content>为什么总感觉还会再见到你? 既然走了为什么再回来? </content>
            <from>来自 QQ空间说说</from>
        </blog>
        <blog>
            <portrait>http://192.168.1.126/Myweb/portrait3.jpeg</portrait>
            <name>美食广场</name>
            <content>好诱人的美食哦,你要不要尝尝?</content>
            <pic>http://192.168.1.126/Myweb/content1.jpeg</pic>
            <from>来自 腾讯微博</from>
        </blog>
        <blog>
            <portrait>http://192.168.1.126/Myweb/portrait1.jpeg</portrait>
            <name>蒋坤</name>
            <content>好像双系统不那么好Ghost啊!</content>
            <from>来自 QQ空间说说</from>
        </blog>
        <blog>
            <portrait>http://192.168.1.126/Myweb/portrait2.jpeg</portrait>
            <name>蔓珠莎华</name>
            <content>为什么总感觉还会再见到你? 既然走了为什么再回来? </content>
            <from>来自 QQ空间说说</from>
        </blog>
        <blog>
            <portrait>http://192.168.1.126/Myweb/portrait3.jpeg</portrait>
            <name>各种诱惑美食</name>
            <content>宫廷桂花糕, 好正点!!</content>
            <pic>http://192.168.1.126/Myweb/content1.jpeg</pic>
            <from>来自 腾讯微博</from>
        </blog>
    </blogs>
  • 相关阅读:
    MKMapVIew学习系列2 在地图上绘制出你运行的轨迹
    WPF SDK研究 Intro(6) WordGame1
    WPF SDK研究 Intro(3) QuickStart3
    WPF SDK研究 Layout(1) Grid
    WPF SDK研究 目录 前言
    WPF SDK研究 Intro(7) WordGame2
    WPF SDK研究 Layout(2) GridComplex
    对vs2005创建的WPF模板分析
    WPF SDK研究 Intro(4) QuickStart4
    《Programming WPF》翻译 第6章 资源
  • 原文地址:https://www.cnblogs.com/yejiurui/p/2760876.html
Copyright © 2020-2023  润新知