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

关于android通讯录加载大数据的优化问题

 
阅读更多
在最近的开发中,遇到一个问题,在自己开发的通讯录中,500条联系人加载时慢的问题。
最初把同步本地通讯录的操作,放在软件的loading页去做,把联系人读到缓存中,发现当数据大时,loading页会进入得很慢。然后试着用CursorAdapter去做,实现列表滚动去读数据库,但又发现当用户平凡刷列表时,会出现内存溢出的情况。

那怎么办呢,于是我综合两种情况的优点,进行了合并。当用户在滑动列表时,会把列表显示的部分通过读数据。读出来的数据放入一个MAP中,那么当用户下一次滑到之前的位置时,只需要从MAP中读取数据了。这样即解决了数据量大量,加载到缓存慢,又解决了滑动列表卡的问题。下面是代码

1.首先通过android 通讯录数据库提供的索引表ContactsContract.RawContacts.CONTENT_URI把所有的联系人ID查询出来。
 private List<Long> loadAllContactIds(){
    	List<Long> arr = new ArrayList<Long>();
    	Cursor cursor = cr.query(ContactsContract.RawContacts.CONTENT_URI, null, ContactsContract.RawContacts.DELETED + " = 0",null,null);
    	if(null != cursor && cursor.moveToFirst()){
    		do{
    			long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID));
    			arr.add(id);
    		}while(cursor.moveToNext());
    		cursor.close();
    	}
    	return arr;
    }


2.再通过ID把联系人的各种信息读出来。

private String loadAllContactInfo(long id){
    	Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.RAW_CONTACT_ID + " = "+id,null,null);
    	StringBuffer sb = new StringBuffer();
    	if(null != cursor && cursor.moveToFirst()){
    		do{
    			String type = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE));
    			if(type.equals(StructuredName.CONTENT_ITEM_TYPE)){
    				sb.append(cursor.getString(cursor.getColumnIndex(StructuredName.DISPLAY_NAME))).append("|");
    			}else if(type.equals(Nickname.CONTENT_ITEM_TYPE)){
    				sb.append(cursor.getString(cursor.getColumnIndex(Nickname.NAME))).append("|");
    			}else if(type.equals(Phone.CONTENT_ITEM_TYPE)){
    				sb.append(cursor.getString(cursor.getColumnIndex(Phone.NUMBER))).append("|");
    			}else if(type.equals(Event.CONTENT_ITEM_TYPE) && Event.TYPE.equals(Event.TYPE_BIRTHDAY)){
    				sb.append(cursor.getString(cursor.getColumnIndex(Event.DATA1))).append("|");
    			}
    		}while(cursor.moveToNext());
    		cursor.close();
    	}
    	return sb.toString();
    }   


3.自定义的adapter ,
 private class MyAdapter extends BaseAdapter{
    	
    	private List<Long> ids;
    	private Map<Long,String> maps;  
    	
    	public MyAdapter(List<Long> ids){
    		this.ids = ids;
    		maps = new HashMap<Long, String>();
    	}

	@Override
	public int getCount() {
	   return this.ids.size();
	}

	@Override
	public Object getItem(int position) {
	   return this.ids.get(position);
	}

	@Override
	public long getItemId(int position) {
	   return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
           	if(null == convertView){
		convertView = LayoutInflater.from(TextTextActivity.this).inflate(android.R.layout.simple_list_item_1, null);
		}
		long id = ids.get(position);
		if(convertView instanceof TextView){
             		String res = maps.get(id);
			TextView tv = (TextView)convertView;
			if(TextUtils.isEmpty(res)){
				res = loadAllContactInfo(id);
				maps.put(id, res);
			}
			tv.setText(res);
		}
		return convertView;
	}
    } 
分享到:
评论
1 楼 kedongjun 2012-06-06  
非常强大

相关推荐

    Android通讯录附搜索及字母索引Demo

    在Android平台上,构建一个功能完善的通讯录应用是开发者经常面临的需求。这个"Android通讯录附搜索及字母索引Demo"项目旨在提供一个示例,帮助开发者理解和实现类似原生Android系统通讯录的功能,包括联系人搜索和...

    基于Android+SQLite的手机通讯录管理器

    "基于Android+SQLite的手机通讯录管理器" 知识点一:Android平台下的数据库管理 Android平台下,SQLite是最常用的数据库管理系统。SQLite是一种轻量级的 Relation Database Management System(关系数据库管理系统...

    android 实现仿微信通讯录

    android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android ...

    Android通讯录的开发-完整代码

    在Android平台上,开发一个完整的通讯录应用涉及到许多关键知识点,这些知识点构成了Android应用程序设计的基础。以下将详细解析这个项目的相关技术点: 1. **Activity与Intent**:Android应用中的核心组件是...

    android 通讯录(A-Z)带可模糊查询搜索框

    同时,考虑到内存使用,可以使用`CursorLoader`配合`ContentProvider`来异步加载和管理通讯录数据,避免一次性加载大量数据导致内存压力。 总结起来,这个项目涵盖了Android UI设计、数据处理、事件监听、搜索功能...

    Android通讯录的源代码

    【Android通讯录源代码解析】 在移动设备上,通讯录是一个至关重要的功能,它帮助用户存储、管理和查找联系人的信息。本项目是基于Java语言开发的Android通讯录应用,提供了全面的通讯录功能,旨在帮助开发者理解...

    使用android通讯录中的内容提供者实例

    在这个实例中,我们将深入探讨如何使用Android通讯录的内容提供者来查询和添加联系人。 一、Android内容提供者基础 内容提供者是一个实现了ContentProvider类的组件,它负责存储、检索以及更新应用程序的数据。每个...

    android通讯录(完整,可运行)

    《Android通讯录系统详解——基于adt-bundle-windows的实现》 在移动设备上,通讯录是用户日常使用的重要功能之一。Android系统以其开放性和灵活性,为开发者提供了丰富的API,使得开发自定义通讯录应用成为可能。...

    仿android通讯录demo

    通过以上分析,我们可以看出,【仿android通讯录demo】项目涵盖了Android开发的多个关键领域,包括UI设计、数据操作、事件处理、权限管理以及用户体验优化等,是学习和实践Android开发的一个良好实例。

    Android通讯录源代码

    【Android通讯录源代码】是Android平台上实现联系人管理功能的一种源码实现,它涉及到Android系统的核心组件和服务,包括数据库操作、UI设计、数据存储和检索等关键知识点。在这个源码中,我们可以深入理解Android...

    android通讯录demo

    android通讯录demo

    Android通讯录.zip

    《Android通讯录项目详解》 在移动开发领域,Android平台上的通讯录管理是不可或缺的一部分,它涉及到用户数据的存储、查询、更新以及删除等操作。本篇将详细探讨基于Android的通讯录项目,主要涉及的技术点包括...

    Android通讯录源码.rar

    【Android通讯录源码分析】 本项目是一款基于Android平台的通讯录应用,它不仅提供了基本的本地联系人存储和检索功能,还集成了拨打电话和发送短信的能力,非常适合用于学习和理解Android应用开发中的核心概念和...

    android 通讯录 (有索引)

    在Android系统中,通讯录是用户管理联系人信息的重要工具,它允许用户存储、查找和管理他们的联系人数据。...在实际开发中,还需要考虑性能优化、隐私保护以及不同设备和Android版本的兼容性问题。

    android通讯录

    Android 通讯录小软件开发 本资源是一个 Android 通讯录小软件的开发实践,包括了 Android 通讯录的开发、 SQLite 数据库的使用、联系人信息的存储和管理等方面的知识点。 一、Android 通讯录的开发 Android ...

    自己做的android通讯录

    在Android平台上,开发一个通讯录应用是学习移动应用开发的基础步骤之一。这个“自己做的android通讯录”项目,显然是一个初学者为了掌握Android编程而创建的。它涉及到的关键知识点包括Android应用的基本架构、数据...

    基于android通讯录的实现

    对于大量联系人的情况,需要考虑性能优化,比如使用CursorLoader进行异步加载,避免一次性加载所有联系人导致内存压力过大。 10. **测试与调试**: 对通讯录应用进行全面的测试,确保在不同设备和系统版本上的...

    Android通讯录源码

    在Android平台上,构建一个通讯录应用是常见的任务,涉及到用户界面设计、数据存储与检索、权限管理等多个核心知识点。这份"Android通讯录源码"提供了一个实现这一功能的实例,让我们来深入探讨其中的关键技术。 1....

    android通讯录左侧滑动搜索效果

    此外,为了优化性能,我们需要考虑异步加载和数据绑定。在用户输入时,后台线程可以执行搜索操作,避免阻塞UI线程。同时,数据绑定框架如`RecyclerView`的`Adapter`可以自动更新列表项,使得搜索结果能够即时显示。 ...

    android 通讯录(注释完整)

    在Android平台上,开发一个完整的通讯录应用涉及到许多关键知识点,包括数据存储、用户界面设计、查询与搜索功能、图片处理以及权限管理等。下面将详细阐述这些内容。 1. 数据存储:Android通讯录通常使用SQLite...

Global site tag (gtag.js) - Google Analytics