31-异步获取数据

来源:互联网 发布:数字验证码识别算法 编辑:程序博客网 时间:2024/05/01 23:12

        <!-- 访问internet权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
 <!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

读取资源的格式

<?xml version="1.0" encoding="utf-8"?><contacts>    <contact id="1">        <name>zs</name>        <image src="http://190.168.0.1:8080/web/images/1.gif"/>    </contact> </contacts>


 /DataAsyncLoad/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <ListView        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:id="@+id/listView"/></LinearLayout>
给listview设置项目 /DataAsyncLoad/res/layout/listview_item.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <ImageView         android:layout_width="120dp"        android:layout_height="120dp"        android:id="@+id/imageView"        />    <TextView         android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textSize="18sp"        android:textColor="#FFFFFF"        android:id="@+id/textView"                /></LinearLayout>

定义实体

package cn.itcast.domain;public class Contact {public int id;public String name;public String image;public Contact(int id, String name, String image) {this.id = id;this.name = name;this.image = image;}public Contact(){}}

/DataAsyncLoad/src/cn/itcast/service/ContactService.java


package cn.itcast.service;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import android.net.Uri;import android.util.Xml;import cn.itcast.domain.Contact;import cn.itcast.utils.MD5;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)); //读取id}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字符串.jpgFile 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;}}

自定义适配器 添加数据到listv

package cn.itcast.adapter;import java.io.File;import java.util.List;import cn.itcast.asyncload.R;import cn.itcast.domain.Contact;import cn.itcast.service.ContactService;import android.content.Context;import android.net.Uri;import android.os.AsyncTask;import android.os.Handler;import android.os.Message;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;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;}       //每显示一个条目就会调用此方法 position目前要显示条目所绑定的数据索引值 convertView对显示的第一屏进行缓存   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);}        private final class AsyncImageTask extends AsyncTask<String, Integer, Uri>{ // handler+thread+线程池    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) {//运行在主线程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;}}}
/DataAsyncLoad/src/cn/itcast/service/ContactService.java

package cn.itcast.asyncload;import java.io.File;import java.util.List;import cn.itcast.adapter.ContactAdapter;import cn.itcast.domain.Contact;import cn.itcast.service.ContactService;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.widget.ListView;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();           }@Overrideprotected void onDestroy() {for(File file : cache.listFiles()){file.delete();}cache.delete();super.onDestroy();}    }



0 0
原创粉丝点击