android 数据异步加载

public class MainActivity extends Activity {
    ListView listView;
    File cache;
    //访问其他线程在当前线程中存放的数据
    Handler handler = new Handler(){
        public void handleMessage(Message msg) {
             listView.setAdapter(new ContactAdapter(MainActivity.this, (List<Contact>)msg.obj, 
                     R.layout.listview_item, cache));
        }        
    };
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        listView = (ListView) this.findViewById(R.id.listView);
        //缓存文件
        cache = new File(Environment.getExternalStorageDirectory(), "cache");
        if(!cache.exists()) cache.mkdirs();
        
        new Thread(new Runnable() {            
            public void run() {
                try {
                    List<Contact> data = ContactService.getContacts();
                    handler.sendMessage(handler.obtainMessage(22, data));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();       
    }

    @Override
    protected void onDestroy() {
        for(File file : cache.listFiles()){
            file.delete();
        }
        cache.delete();
        super.onDestroy();
    }
    
}
public class ContactAdapter extends BaseAdapter {
    private List<Contact> data;
    private int listviewItem;
    private File cache;
    LayoutInflater layoutInflater;
    
    public ContactAdapter(Context context, List<Contact> data, int listviewItem, File cache) {
        this.data = data;
        this.listviewItem = listviewItem;
        this.cache = cache;
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    /**
     * 得到数据的总数
     */
    public int getCount() {
        return data.size();
    }
    /**
     * 根据数据索引得到集合所对应的数据
     */
    public Object getItem(int position) {
        return data.get(position);
    }
    
    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView = null;
        TextView textView = null;
        
        if(convertView == null){
            convertView = layoutInflater.inflate(listviewItem, null);
            imageView = (ImageView) convertView.findViewById(R.id.imageView);
            textView = (TextView) convertView.findViewById(R.id.textView);
            convertView.setTag(new DataWrapper(imageView, textView));
        }else{
            DataWrapper dataWrapper = (DataWrapper) convertView.getTag();
            imageView = dataWrapper.imageView;
            textView = dataWrapper.textView;    
        }
        Contact contact = data.get(position);
        textView.setText(contact.name);
        asyncImageLoad(imageView, contact.image);
        return convertView;
    }
    private void asyncImageLoad(ImageView imageView, String path) {
        AsyncImageTask asyncImageTask = new AsyncImageTask(imageView);
        asyncImageTask.execute(path);
        
    }
    //实现资源的异步加载,可以防止打开很多条线程 影响程序的功能String输入参数类型,Uri子线程返回的数据类型
    private final class AsyncImageTask extends AsyncTask<String, Integer, Uri>{
        private ImageView imageView;
        public AsyncImageTask(ImageView imageView) {
            this.imageView = imageView;
        }
        protected Uri doInBackground(String... params) {//子线程中执行的
            try {
                return ContactService.getImage(params[0], cache);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
        protected void onPostExecute(Uri result) {//运行在主线程,参数为doInBackground返回的值
            if(result!=null && imageView!= null)
                imageView.setImageURI(result);
        }    
    }
    /*
    private void asyncImageLoad(final ImageView imageView, final String path) {
        final Handler handler = new Handler(){
            public void handleMessage(Message msg) {//运行在主线程中
                Uri uri = (Uri)msg.obj;
                if(uri!=null && imageView!= null)
                    imageView.setImageURI(uri);
            }
        };
        
        Runnable runnable = new Runnable() {            
            public void run() {
                try {
                    Uri uri = ContactService.getImage(path, cache);
                    handler.sendMessage(handler.obtainMessage(10, uri));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        new Thread(runnable).start();
    }
*/
    private final class DataWrapper{
        public ImageView imageView;
        public TextView textView;
        public DataWrapper(ImageView imageView, TextView textView) {
            this.imageView = imageView;
            this.textView = textView;
        }
    }
}
public class ContactService {

    /**
     * 获取联系人
     * @return
     */
    public static List<Contact> getContacts() throws Exception{
        String path = "http://192.168.1.100:8080/web/list.xml";
        HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode() == 200){
            return parseXML(conn.getInputStream());
        }
        return null;
    }

    private static List<Contact> parseXML(InputStream xml) throws Exception{
        List<Contact> contacts = new ArrayList<Contact>();
        Contact contact = null;
        XmlPullParser pullParser = Xml.newPullParser();
        pullParser.setInput(xml, "UTF-8");
        int event = pullParser.getEventType();
        while(event != XmlPullParser.END_DOCUMENT){
            switch (event) {
            case XmlPullParser.START_TAG:
                if("contact".equals(pullParser.getName())){
                    contact = new Contact();
                    contact.id = new Integer(pullParser.getAttributeValue(0));
                }else if("name".equals(pullParser.getName())){
                    contact.name = pullParser.nextText();
                }else if("image".equals(pullParser.getName())){
                    contact.image = pullParser.getAttributeValue(0);
                }
                break;

            case XmlPullParser.END_TAG:
                if("contact".equals(pullParser.getName())){
                    contacts.add(contact);
                    contact = null;
                }
                break;
            }
            event = pullParser.next();
        }
        return contacts;
    }
    /**
     * 获取网络图片,如果图片存在于缓存中,就返回该图片,否则从网络中加载该图片并缓存起来
     * @param path 图片路径
     * @return
     */
    public static Uri getImage(String path, File cacheDir) throws Exception{// path -> MD5 ->32字符串.jpg
        File localFile = new File(cacheDir, MD5.getMD5(path)+ path.substring(path.lastIndexOf(".")));
        if(localFile.exists()){
            return Uri.fromFile(localFile);
        }else{
            HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
            conn.setConnectTimeout(5000);
            conn.setRequestMethod("GET");
            if(conn.getResponseCode() == 200){
                FileOutputStream outStream = new FileOutputStream(localFile);
                InputStream inputStream = conn.getInputStream();
                byte[] buffer = new byte[1024];
                int len = 0;
                while( (len = inputStream.read(buffer)) != -1){
                    outStream.write(buffer, 0, len);
                }
                inputStream.close();
                outStream.close();
                return Uri.fromFile(localFile);
            }
        }
        return null;
    }

}
public class MD5 {

    public static String getMD5(String content) {
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(content.getBytes());
            return getHashString(digest);
            
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    private static String getHashString(MessageDigest digest) {
        StringBuilder builder = new StringBuilder();
        for (byte b : digest.digest()) {
            builder.append(Integer.toHexString((b >> 4) & 0xf));
            builder.append(Integer.toHexString(b & 0xf));
        }
        return builder.toString();
    }
}

 

posted @ 2014-01-15 17:07  天之涯0204  阅读(386)  评论(0编辑  收藏  举报