`
zhengjj_2009
  • 浏览: 153141 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

项目的总结4、异步加载列表数据

 
阅读更多

异步加载数据的基本功能

将某台主机上的数据文件(文件加图片)读取到手机应用上,加以列表展示。

基本步骤:

1、新建一个工程,在manifest.xml添加访问权限、定义main.xml和item.xml的描述文件、定义信息实体bean。

 

2、实现ContactService的业务逻辑:

      getContacts():访问服务器上的数据文件(xml),并进行解析;

      getImage():获取服务器上的图片资源,并缓存在本地的SD卡上

 

3、在MainActivity中获取数据内容,并实现ListView数据的绑定

 

4、实现ContactAdapter的所有方法,并在处理获取图片时采用AsyncTask进行处理

 

===============================================================

1、新建一个工程,在manifest.xml添加访问权限、定义main.xml和item.xml的描述文件、定义信息实体bean。

 

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

 

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

 

<?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="vertical" >
    <ImageView android:layout_width="match_parent" android:layout_height="400dp" android:id="@+id/imageView" />

    <TextView android:layout_width="match_parent" android:layout_height="wrap_content"
        android:textSize="18sp" android:textColor="#FF0000" android:id="@+id/textView"  />
</LinearLayout>

 

2、实现ContactService的业务逻辑:

getContacts():访问服务器上的数据文件(xml),并进行解析;

getImage():获取服务器上的图片资源,并缓存在本地的SD卡上

 

/**
	 * 获取联系人
	 * @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;
	}

 

3、在MainActivity中获取数据内容,并实现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();       
    }

	@Override
	protected void onDestroy() {
		for(File file : cache.listFiles()){
			file.delete();
		}
		cache.delete();
		super.onDestroy();
	}
    
}

 

 

4、实现ContactAdapter的所有方法,并在处理获取图片时采用AsyncTask进行处理

 

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);
		
	}
    
    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) {//运行在主线程
			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;
		}
	}
}

 

 

 

分享到:
评论

相关推荐

    Echarts:基础折线图(含异步加载数据)

    总结来说,ECharts的基础折线图是通过定义配置项和数据来创建的,而异步加载数据则可以通过HTTP请求从服务器获取,然后动态更新配置项以反映新的数据。这种灵活性使得ECharts能够适应各种复杂的数据可视化需求。在...

    异步加载网络数据,自定义进度条显示

    在实际项目中,这样的工具类通常会提供异步加载数据的方法,例如: ```objc - (void)loadDataWithURL:(NSURL *)url completion:(void(^)(NSData *data, NSError *error))completion; ``` 在这个方法中,请求的完成...

    手机移动端Tab选项卡切换带下拉数据异步加载js插件

    总结,手机移动端Tab选项卡切换带下拉数据异步加载js插件是一种高效的页面交互解决方案,它通过结合Tab选项卡、下拉加载和异步加载技术,提升了移动应用的性能和用户体验。开发者可以通过理解这些核心概念和技巧,...

    异步加载树节点.zip

    "异步加载树节点"是一种策略,它允许我们分批次、按需地加载数据到TreeView中。当用户滚动或展开特定节点时,仅加载该节点及其子节点的相关数据。这样,只有在必要时才会请求服务器或数据库,减少对主线程的影响,...

    react 异步加载例子

    总结,这个React异步加载示例涵盖了状态管理、事件监听、Ajax请求和自动化构建等核心概念,同时展示了如何组织一个React项目的文件结构。通过理解和实践这些知识点,开发者能够创建出更高效、用户体验更好的React...

    异步加载的3d图片效果

    在IT行业中,异步加载是一种优化用户体验的重要技术,特别是在处理大量数据或资源,如图片时。在这个场景中,"异步加载的3d图片效果"指的是一个应用或项目,它结合了3D图像展示和异步加载技术,使得用户可以在浏览3D...

    用线程池异步加载

    总结起来,这个项目是关于如何在Android应用中使用线程池进行图片的异步加载,以优化性能并提高用户体验。通过合理配置线程池,我们可以有效地控制并发任务的数量,同时避免了主线程被阻塞,保证了应用的流畅运行。...

    gridview异步加载

    总结起来,"gridview异步加载"是一个关于如何在Android的GridView中高效加载和显示图片的技术主题,通过使用像Universal Image Loader、Picasso、Glide或Fresco这样的库,我们可以实现流畅的用户体验,同时避免性能...

    listview 异步加载网络图片

    10. **总结**:在Android的ListView中实现异步加载网络图片,需要结合异步处理框架、选择合适的图片库、优化缓存策略、合理管理内存,并对ListView进行优化。通过这些手段,可以显著提升应用的性能和用户体验。

    ExtJS构造动态异步加载

    总结,使用ExtJS结合AJAX和JSON数据格式,可以构建出动态异步加载的树形组件。这种方式既节省了网络资源,又保证了用户界面的流畅性。在实际开发中,可以根据项目需求进一步定制树的样式、交互以及数据处理逻辑。

    c# webform 异步加载用户控件

    总结来说,通过C# WebForm的异步加载用户控件,我们可以实现页面的局部刷新,提高用户体验,同时降低了服务器负担。在实际开发中,还可以结合缓存、数据绑定等技术进一步优化性能。记住,关键在于利用Ajax技术与...

    Android-搭建简单服务器+ViewPager异步加载数据

    在Android开发中,有时我们需要实现一个简单的...同时,结合ViewPager的异步加载数据功能,能够创建一个流畅、高效的用户界面。这两个技术对于任何Android开发者来说都是至关重要的工具,能够提升应用的质量和性能。

    异步&同步加载树节点----zTree(一)

    总结来说,zTree的异步加载机制是其强大功能的一部分,它允许开发者灵活地处理大数据量的树结构,提升应用性能。理解并掌握异步加载的原理和配置,对于优化zTree的使用至关重要,也是前端开发中的重要技能之一。通过...

    jquery ztree 异步加载

    异步加载的基本思路是在树结构初次加载时仅加载根节点或部分数据,当用户展开某个节点时,再通过AJAX请求从服务器获取该节点下的子节点数据,并动态添加到树结构中。这种方式不仅减少了初始加载的数据量,也提高了...

    xamarin异步加载并缓存图片库

    总结来说,Xamarin异步加载并缓存图片库是提高移动应用性能和用户体验的关键技术。通过使用异步编程、内存和磁盘缓存,配合生命周期管理和性能优化策略,开发者可以构建出高效、流畅的图片显示功能。

    Android studio异步数据加载ListView+Adapter+AsyncTask

    总结,通过结合ListView、Adapter和AsyncTask,我们可以实现在Android Studio中异步加载数据,提高应用的响应速度和用户体验。在实际开发中,还需要根据项目的具体需求,灵活运用这些技术和库,不断优化数据加载的...

    android异步加载图片源码

    在Android开发中,异步加载图片是一项至关重要的技术,特别是在处理大数据量的图像列表时,如GridView或RecyclerView。异步加载能确保用户界面的流畅性,避免因加载大图而导致应用卡顿。本文将深入探讨Android异步...

    EGOImageLoading图片列表异步加载

    总结来说,EGOImageLoading是一个优秀的解决方案,适用于需要高效、流畅的图片列表异步加载的iOS应用。它的自动缓存和预加载机制确保了良好的用户体验,而其简单的API则降低了集成成本。对于任何处理大量图片的iOS...

    Android中使用ListView数据异步加载与AsyncTask

    总结,Android中的ListView数据异步加载结合AsyncTask可以有效解决UI卡顿问题,同时利用线程池优化后台任务的执行,提高应用的性能和用户体验。通过合理的数据加载优化策略,可以进一步提升应用的运行效率。在实际...

    使用CursorLoader异步加载SQLite数据源码

    总结,CursorLoader是Android中异步加载SQLite数据的优秀工具,它结合了ContentProvider和Loader框架,实现了后台查询、数据变化监听和UI更新等功能。通过以上步骤,你可以在不阻塞主线程的情况下高效地加载SQLite...

Global site tag (gtag.js) - Google Analytics