zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    刘若英和她的<<蝴蝶>>
    我的心情日记
    flash鼠标特效
    flash的播放器
    NoSQL数据存储引擎
    分享iphone开发的好网站,希望大家也能提供一些分享下
    创业经验总结
    产品经理之我见
    软件开发报价的计算方法
    Android实现号码归属地查询
  • 原文地址:https://www.cnblogs.com/yejiurui/p/2760876.html
Copyright © 2011-2022 走看看