Cursor finalized without prior close()

 
 
Cursor循环内再申请Cursor,记得将内部申请的每个Cursor都加上close
ContentResolver resolver = getContentResolver();
        Uri URI = ContactsContract.Contacts.CONTENT_URI;
        String[] columns  = new String[] {ContactsContract.Contacts._ID
        		,PhoneLookup.DISPLAY_NAME};
        //查询联系人ID和联系人名称两列
        
        
        Cursor cursor = resolver.query(URI, columns, 
        		PhoneLookup.HAS_PHONE_NUMBER+"=1", null, null);
        //限定只返回有号码的联系人
        
        
        while(cursor.moveToNext()){
        	
        	String phoneNum="";
        	Cursor cursor2=resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
        			, new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER}, 
        			ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+cursor.getLong(0)
        			, null, null);
        	//因为号码与联系人不存在一个表中,一个联系人可能存在多个号码,
        	//所以根据联系人ID查找号码,存在phoneNum中
        	
        	
        	while(cursor2.moveToNext()) {
        		phoneNum+=cursor2.getString(0)+"||";
        		//循环把该联系的所属的号码加进phoneNum
        	}
        	cursor2.close();
        	//同学,就是这里了,cursor里申请第二个cursor2,
        	//记得将每个cursor2给关闭了,不然就资源泄漏了。 
        	
        	
        	Log.d("LocTestDemo", "--" + cursor.getLong(0) + ":" 
        				+ cursor.getString(1) + "::" + phoneNum);
        	
        	//往JSONArray里添加一个联系人信息
        	singer = new JSONObject();
        	try {
        		singer.put("id", cursor.getLong(0));
            	singer.put("name", cursor.getString(1));
				singer.put("phone", phoneNum);
			} catch (JSONException e) {
				e.printStackTrace();
			}
        	singers.put(singer);
        	
        }
        cursor.close();
        //这里其实还得加上try,里外的Cursor都要加,
        //在catch里判断cursor是否为空,不为空还得给关闭。


cursor循环内再申请cursor记得将内部申请的每个cursor都关闭


你可能感兴趣的:(Cursor,uri,contact,contentprivoder)