`
shuai1234
  • 浏览: 930471 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

从网络上加载XML资源,其中包括图片,我们要做的解析XML里面的数据,并且把图片缓存到本地一个cache目录里面,并且用一个自定义的Adapter去填充到LIs

 
阅读更多

从网络上加载XML资源,其中包括图片,我们要做的解析XML里面的数据,并且把图片缓存到本地一个cache目录里面,并且用一个自定义的Adapter去填充到LIstView:
对象类

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Contact {
        int id;
        String image;
        String name;
         
        public Contact() {
                super();
        }
        public Contact(int id, String image, String name) {
                this.id = id;
                this.image = image;
                this.name = name;
        }
        public int getId() {
                return id;
        }
        public void setId(int id) {
                this.id = id;
        }
        public String getImage() {
                return image;
        }
        public void setImage(String image) {
                this.image = image;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
         
}


service类

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
public class ContactService {
 
        /*
         * 从服务器上获取数据
         */
        public List<Contact> getContactAll() throws Exception {
                List<Contact> contacts = null;
                String Parth = "http://10.0.2.2:8080/AsyncTaskTest/list.xml";
                URL url = new URL(Parth);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(30000);
                conn.setReadTimeout(30000);
                conn.setRequestMethod("GET");
                if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                        InputStream is = conn.getInputStream();
                        // 这里获取数据直接放在XmlPullParser里面解析
                        contacts = xmlParser(is);
                        return contacts;
                } else {
                        return null;
                }
        }
 
        // 这里并没有下载图片下来,而是把图片的地址保存下来了
        private List<Contact> xmlParser(InputStream is) throws Exception {
                List<Contact> contacts = null;
                Contact contact = null;
                XmlPullParser parser = Xml.newPullParser();
                parser.setInput(is, "UTF-8");
                int eventType = parser.getEventType();
                while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) {
                        switch (eventType) {
                        case XmlPullParser.START_TAG:
                                if (parser.getName().equals("contacts")) {
                                        contacts = new ArrayList<Contact>();
                                } else if (parser.getName().equals("contact")) {
                                        contact = new Contact();
                                        contact.setId(Integer.valueOf(parser.getAttributeValue(0)));
                                } else if (parser.getName().equals("name")) {
                                        contact.setName(parser.nextText());
                                } else if (parser.getName().equals("image")) {
                                        contact.setImage(parser.getAttributeValue(0));
                                }
                                break;
 
                        case XmlPullParser.END_TAG:
                                if (parser.getName().equals("contact")) {
                                        contacts.add(contact);
                                }
                                break;
                        }
                }
                return contacts;
        }
 
        /*
         * 从网络上获取图片,如果图片在本地存在的话就直接拿,如果不存在再去服务器上下载图片
         * 这里的path是图片的地址
         */
        public Uri getImageURI(String path, File cache) throws Exception {
                String name = MD5.getMD5(path) + path.substring(path.lastIndexOf("."));
                File file = new File(cache, name);
                // 如果图片存在本地缓存目录,则不去服务器下载
                if (file.exists()) {
                        return Uri.fromFile(file);//Uri.fromFile(path)这个方法能得到文件的URI
                } else {
                        // 从网络上获取图片
                        URL url = new URL(path);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.setConnectTimeout(5000);
                        conn.setRequestMethod("GET");
                        conn.setDoInput(true);
                        if (conn.getResponseCode() == 200) {
 
                                InputStream is = conn.getInputStream();
                                FileOutputStream fos = new FileOutputStream(file);
                                byte[] buffer = new byte[1024];
                                int len = 0;
                                while ((len = is.read(buffer)) != -1) {
                                        fos.write(buffer, 0, len);
                                }
                                is.close();
                                fos.close();
                                // 返回一个URI对象
                                return Uri.fromFile(file);
                        }
                }
                return null;
        }
}


自定义Adapter

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
public class ImageAdapter extends BaseAdapter {
 
        protected static final int SUCCESS_GET_IMAGE = 0;
        private Context context;
        private List<Contact> contacts;
        private File cache;
        private LayoutInflater mInflater;
 
        // 自己定义的构造函数
        public ImageAdapter(Context context, List<Contact> contacts, File cache) {
                this.context = context;
                this.contacts = contacts;
                this.cache = cache;
 
                mInflater = (LayoutInflater) context
                                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
 
        @Override
        public int getCount() {
                return contacts.size();
        }
 
        @Override
        public Object getItem(int position) {
                return contacts.get(position);
        }
 
        @Override
        public long getItemId(int position) {
                return position;
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                // 1获取item,再得到控件
                // 2 获取数据
                // 3绑定数据到item
                View view = null;
                if (convertView != null) {
                        view = convertView;
                } else {
                        view = mInflater.inflate(R.layout.item, null);
                }
 
                ImageView iv_header = (ImageView) view.findViewById(R.id.imageView);
                TextView tv_name = (TextView) view.findViewById(R.id.textView);
 
                Contact contact = contacts.get(position);
                 
                // 异步的加载图片 (线程池 + Handler ) ---> AsyncTask
                asyncloadImage(iv_header, contact.image);
                 
                tv_name.setText(contact.name);
 
                return view;
        }
         
        private void asyncloadImage(ImageView iv_header, String path) {
                ContactService service = new ContactService();
                AsyncImageTask task = new AsyncImageTask(service, iv_header);
                task.execute(path);
        }
 
        private final class AsyncImageTask extends AsyncTask<String, Integer, Uri> {
 
                private ContactService service;
                private ImageView iv_header;
 
                public AsyncImageTask(ContactService service, ImageView iv_header) {
                        this.service = service;
                        this.iv_header = iv_header;
                }
 
                // 后台运行的子线程子线程
                @Override
                protected Uri doInBackground(String... params) {
                        try {
                                return service.getImageURI(params[0], cache);
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                        return null;
                }
 
                // 这个放在在ui线程中执行
                @Override
                protected void onPostExecute(Uri result) {
                        super.onPostExecute(result);
                        // 完成图片的绑定
                        if (iv_header != null && result != null) {
                                iv_header.setImageURI(result);
                        }
                }
        }
}

 

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class MainActivity extends Activity {
        protected static final int SUCCESS_GET_CONTACT = 0;
        private ListView mListView;
        private ImageAdapter mAdapter;
        private File cache;
         
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        mListView = (ListView) findViewById(R.id.listView);
         
        //创建缓存目录,系统一运行就得创建缓存目录的,
        cache = new File(Environment.getExternalStorageDirectory(), "cache");
         
        if(!cache.exists()){
                cache.mkdirs();
        }
         
        //获取数据,主UI线程是不能做耗时操作的,所以启动子线程来做
        new Thread(){
                public void run() {
                        ContactService service = new ContactService();
                        List<Contact> contacts = null;
                                try {
                                        contacts = service.getContactAll();
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }
                                //子线程通过Message对象封装信息,并且用初始化好的,
                                //Handler对象的sendMessage()方法把数据发送到主线程中,从而达到更新UI主线程的目的
                        Message msg = new Message();
                        msg.what = SUCCESS_GET_CONTACT;
                        msg.obj = contacts;
                        mHandler.sendMessage(msg);
                };
        }.start();
    }
     
    private Handler mHandler = new Handler(){
                public void handleMessage(android.os.Message msg) {
                        if(msg.what == SUCCESS_GET_CONTACT){
                                List<Contact> contacts = (List<Contact>) msg.obj;
                                mAdapter = new ImageAdapter(getApplicationContext(),contacts,cache);
                                mListView.setAdapter(mAdapter);
                        }
                };
        };
     
    @Override
    protected void onDestroy() {
            super.onDestroy();
            //清空缓存
            File[] files = cache.listFiles();
            for(File file :files){
                    file.delete();
            }
            cache.delete();
    }
}


务器xml文件

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
<?xml version="1.0" encoding="UTF-8"?>
<contacts>
        <contact id="1">
                <name>图标1</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/1.png" />
        </contact>
        <contact id="2">
                <name>图标2</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/2.png" />
        </contact>
        <contact id="3">
                <name>图标3</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/3.png" />
        </contact>
        <contact id="4">
                <name>图标4</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/4.png" />
        </contact>
        <contact id="5">
                <name>图标5</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/5.png" />
        </contact>
        <contact id="6">
                <name>图标6</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/6.png" />
        </contact>
        <contact id="7">
                <name>图标7</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/7.png" />
        </contact>
        <contact id="8">
                <name>图标8</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/8.png" />
        </contact>
        <contact id="9">
                <name>图标9</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/9.png" />
        </contact>
        <contact id="10">
                <name>图标10</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/10.png" />
        </contact>
        <contact id="11">
                <name>图标11</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/11.png" />
        </contact>
        <contact id="12">
                <name>图标12</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/12.png" />
        </contact>
 
        <contact id="13">
                <name>图标13</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/13.png" />
        </contact>
        <contact id="14">
                <name>图标14</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/14.png" />
        </contact>
        <contact id="15">
                <name>图标15</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/15.png" />
        </contact>
        <contact id="16">
                <name>图标16</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/16.png" />
        </contact>
        <contact id="17">
                <name>图标17</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/17.png" />
        </contact>
        <contact id="18">
                <name>图标18</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/18.png" />
        </contact>
        <contact id="19">
                <name>图标19</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/19.png" />
        </contact>
        <contact id="20">
                <name>图标20</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/20.png" />
        </contact>
         
        <contact id="21">
                <name>图标21</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/1.png" />
        </contact>
        <contact id="22">
                <name>图标22</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/2.png" />
        </contact>
        <contact id="23">
                <name>图标23</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/3.png" />
        </contact>
        <contact id="24">
                <name>图标24</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/4.png" />
        </contact>
        <contact id="25">
                <name>图标25</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/5.png" />
        </contact>
        <contact id="26">
                <name>图标26</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/6.png" />
        </contact>
        <contact id="27">
                <name>图标27</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/7.png" />
        </contact>
        <contact id="28">
                <name>图标28</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/8.png" />
        </contact>
        <contact id="29">
                <name>图标29</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/9.png" />
        </contact>
        <contact id="30">
                <name>图标30</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/10.png" />
        </contact>
        <contact id="31">
                <name>图标31</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/11.png" />
        </contact>
        <contact id="32">
                <name>图标32</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/12.png" />
        </contact>
 
        <contact id="33">
                <name>图标33</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/13.png" />
        </contact>
        <contact id="34">
                <name>图标34</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/14.png" />
        </contact>
        <contact id="35">
                <name>图标35</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/15.png" />
        </contact>
        <contact id="36">
                <name>图标36</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/16.png" />
        </contact>
        <contact id="37">
                <name>图标37</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/17.png" />
        </contact>
        <contact id="38">
                <name>图标38</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/18.png" />
        </contact>
        <contact id="39">
                <name>图标39</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/19.png" />
        </contact>
        <contact id="40">
                <name>图标40</name>
                <image src="http://192.168.34.20:8080/AsyncTaskTest/image/20.png" />
        </contact>
</contacts>
分享到:
评论

相关推荐

    Java资源包01

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包2

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    JAVA上百实例源码以及开源项目源代码

    图片到图片装载器、绘制火焰效果的X坐标,Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT ...

    java开源包5

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java开源包1

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包11

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包3

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包6

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包10

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包4

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包8

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包7

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包9

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包101

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    新版Android开发教程.rar

    也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...

    asp.net知识库

    鼠标放在一个连接上,会显示图片(类似tooltip) 使用microsoft.web.ui.webcontrols的TabStrip与IFame组件,达到页的切换效果 HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署...

    博客 v1.2源码20121013

    页面缓存 OutputCache 以及对象缓存 HttpRuntime.Cache 如果你提交了文章发现首页没有更新,那是因为默认设置了5分钟的页面缓存。 webconfig中caching节点处,你可以在这里修改设置。 开发环境: Visual ...

    YQBlog - 基于Asp.Net MVC3 EF4.0技术的个人博客系统

    页面缓存 OutputCache 以及对象缓存 HttpRuntime.Cache 如果你提交了文章发现首页没有更新,那是因为默认设置了5分钟的页面缓存。 webconfig中caching节点处,你可以在这里修改设置。 开发环境: Visual ...

Global site tag (gtag.js) - Google Analytics