主活动
公共 类 MainActivity 延伸活动{ ListView中的ListView; 文件缓存; 处理程序处理程序处理程序(){ 公共无效的handleMessage(消息msg){ / / 异步加载完后的图片数据集合 listView.setAdapter(新 ContactAdapter(MainActivity. 此,(列表<联系人> )msg.obj, R.layout.listview_item,高速缓存)); } }; @覆盖 公共 无效的onCreate(捆绑savedInstanceState){ 超级的onCreate(savedInstanceState); 的setContentView(R.layout.main); LISTVIEW =(ListView中)。findViewById(R.id.listView)的; / / 图片的缓存目录 缓存= 新的文件(Environment.getExternalStorageDirectory(),“缓存” ); 如果(()) ! cache.exists cache.mkdirs(); 新的主题(新的Runnable(){ 公共 无效的run(){ 尝试{ / / 加载的是名字和图片URL信息 列表<Contact>数据ContactService.getContacts(); handler.sendMessage handler.obtainMessage( 22 ,数据); } 赶上(例外五){ e.printStackTrace(); } } })(); } @覆盖 保护 无效的OnDestroy(){ (文件文件:cache.listFiles()){ file.delete(); } cache.delete(); 超级的OnDestroy(); } }
内容服务类ContactService
公共 类ContactService的{ / ** *获取联系人 * @返回 / 的 静态列表<联系人> getContacts()抛出异常{ 路径String =“http://192.168.1.100:8080/网络/ list.xml“ ; HttpURLConnection类康恩= == 200 ){ 的回报ParseXML中(conn.getInputStream()); } 返回空; } 18 私人静态列表<联系人> ParseXML中(InputStream中的XML)抛出异常{ 20 <联系人>联系人= 新的ArrayList <联系人> (); 时21 联系方式联系方式= 空; 月23日 XmlPullParser pullParser Xml.newPullParser(); pullParser.setInput(XML,“UTF-8” ); 整数事件pullParser.getEventType(); 27(事件!= XmlPullParser.END_DOCUMENT的){ 29 开关(事件){ 例XmlPullParser.START_TAG: 32(“接触” 。等于(pullParser.getName())){ 34 接触新的联系方式(); contact.id pullParser.nextText(); 40 } (“图像” 。等于(pullParser.getName())){ contact.image = = 空; } 突破51 } 事件pullParser.next(); } 返回接触; } / ** 57 * 图片路径 * @返回60 * / 61 公共静态开放的getImage(弦乐路径,文件CACHEDIR),抛出异常{ / / 路径- > MD5 - > 32字符串。JPG 62 63 文件】localfile = 新的文件(CACHEDIR,MD5.getMD5 (路径)+ 康恩= == 200 ){ 文件输出流outStream = 新的文件输出流(当前文件); 的InputStream输入流= conn.getInputStream(); 字节 []缓冲区= 新的字节 [1024 ] LEN = 0 ; 时((LEN = InputStream中阅读(缓冲区))!= -1 ){ outStream.write(缓冲,0 ,
适配器适配器
公共 类 ContactAdapter的扩展BaseAdapter的{ 私人名单<联系人> 数据; 私人 诠释ListViewItem的 私人文件缓存; LayoutInflater layoutInflater 的 公共 ContactAdapter(上下文的背景下,列表<联系人>的数据,ListViewItem的文件缓存){ 。数据= 数据; 。ListViewItem的ListViewItem的; 。缓存缓存; layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } / ** 14 *得到数据的总数 * 公众诠释/ 16 getCount(){ 的回报data.size(); } / ** 20 *根据数据索引得到集合所对应的数据 * / 22 公共对象的getItem(INT 位置){ 返回data.get (位置); } 26 长 getItemId(INT 位置){ 返回位置; } 30 公共查看getView(位置,查看convertView,ViewGroup的母公司){ ImageView的ImageView的31 = 空; TextView的TextView的空; 34 如果(convertView == 空){ convertView = layoutInflater.inflate(ListViewItem的,NULL ); ImageView的= (ImageView的)convertView.findViewById(R.id.imageView) TextView的= (TextView的)convertView.findViewById“(R id.textView); ImageView的,新的DataWrapper(TextView的)38 convertView.setTag(); } 其他{ 的 DataWrapper dataWrapper = (DataWrapper)convertView.getTag()的 ImageView的dataWrapper.imageView TextView的dataWrapper.textView } 联系方式联系方式data.get(位置); (contact.name)textView.setText; asyncImageLoad(ImageView的,ImageView的路径String){ AsyncImageTask asyncImageTask 整,开放“ { 私人ImageView的ImageView的; 60 公共AsyncImageTask(ImageView的ImageView的){ 本。ImageView的ImageView的 } 保护开放的doInBackground(String. .. PARAMS)高速缓存); } 的catch (例外五){ e.printStackTrace(); } 返回空; } 74 保护无效 onPostExecute(乌里结果)的{ / / 运行在主线程75 如果(result! = 空 && ImageView的 公共TextView的TextView的; 84 公共DataWrapper(ImageView的ImageView的,TextView的TextView的){ 本。ImageView的ImageView的; 本。TextView的TextView的; } } }
MD5 算法,根据路径生成MD5值
2 公共 静态字符串getMD5(String内容){ 尝试{ 公共类MD5 消息摘要消化5 = E){ e.printStackTrace(); } 返回空; } 15 私人静态字符串getHashString(消息摘要摘要){ StringBuilder的建设者= 新的StringBuilder(); (字节的的B:digest.digest()) { builder.append(Integer.toHexString((B >> 4)&0xf的情况)); builder.append(Integer.toHexString(B&0xf会)的); } 的回报builder.toString(); } }