0
点赞
收藏
分享

微信扫一扫

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


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



?


代码片段,双击复制

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类



?


代码片段,双击复制

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



?


代码片段,双击复制

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);
                         }
                }
         }
}



 



?


代码片段,双击复制

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文件



?


代码片段,双击复制

<?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>

举报

相关推荐

0 条评论