从网络上加载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> |
相关推荐
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
图片到图片装载器、绘制火焰效果的X坐标,Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT ...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...
鼠标放在一个连接上,会显示图片(类似tooltip) 使用microsoft.web.ui.webcontrols的TabStrip与IFame组件,达到页的切换效果 HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署...
页面缓存 OutputCache 以及对象缓存 HttpRuntime.Cache 如果你提交了文章发现首页没有更新,那是因为默认设置了5分钟的页面缓存。 webconfig中caching节点处,你可以在这里修改设置。 开发环境: Visual ...
页面缓存 OutputCache 以及对象缓存 HttpRuntime.Cache 如果你提交了文章发现首页没有更新,那是因为默认设置了5分钟的页面缓存。 webconfig中caching节点处,你可以在这里修改设置。 开发环境: Visual ...