Android 将30000个联系人与联系人API同步到我的应用程序

Android 将30000个联系人与联系人API同步到我的应用程序,android,performance,android-contacts,contactscontract,Android,Performance,Android Contacts,Contactscontract,我制作了一个从android联系人存储库同步联系人的应用程序,如下所示: 当你完成注册过程时,它会要求你像Facebook一样同步你的联系人,然后它会将你所有的联系人电话号码发送到服务器,如果你的联系人使用相同的应用程序,服务器会返回,如果不是,它会要求你邀请他们 一切都很好直到我的一个客户有30000个联系人让我在这里寻求解决方案, 因为有30000个联系人,同步过程没有完成,他甚至无法访问他的存储库,因为我的应用程序和Android系统是并行运行的。 谢谢你提前帮忙 以下代码是我使用的代码:

我制作了一个从android联系人存储库同步联系人的应用程序,如下所示: 当你完成注册过程时,它会要求你像Facebook一样同步你的联系人,然后它会将你所有的联系人电话号码发送到服务器,如果你的联系人使用相同的应用程序,服务器会返回,如果不是,它会要求你邀请他们

一切都很好直到我的一个客户有30000个联系人让我在这里寻求解决方案, 因为有30000个联系人,同步过程没有完成,他甚至无法访问他的存储库,因为我的应用程序和Android系统是并行运行的。 谢谢你提前帮忙

以下代码是我使用的代码: 它返回一个包含所有联系人的列表,然后我在for循环中运行以获取所有联系人的照片以显示他们,然后我将列表发送到服务器以检查他们是否使用该应用程序

public class Phoner {
public static void loadPhoneContacts(Context context,
        final OnPhoneContactsLoadedListener listener) {
final List<Bundle> phoneContacts = new ArrayList<Bundle>();
final String[] PROJECTION = new String[] { ContactsContract.Data._ID,
                ContactsContract.Data.DISPLAY_NAME,
                ContactsContract.Data.PHOTO_URI,
                ContactsContract.Data.LOOKUP_KEY,
                ContactsContract.Contacts.HAS_PHONE_NUMBER,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
                ContactsContract.CommonDataKinds.Im.DATA };

        final String SELECTION = "(" + ContactsContract.Data.MIMETYPE + "=\""
                + ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE
                + "\");

        CursorLoader mCursorLoader = new CursorLoader(context,
                ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null,
                null);
        mCursorLoader.registerListener(0, new OnLoadCompleteListener<Cursor>() {

            @Override
            public void onLoadComplete(Loader<Cursor> arg0, Cursor cursor) {
                if (cursor == null) {
                    return;
                }
                while (cursor.moveToNext()) {
                    Bundle contact = new Bundle();
                    contact.putInt("phoneid", cursor.getInt(cursor
                            .getColumnIndex(ContactsContract.Data._ID)));
                    contact.putString(
                            "displayname",
                            cursor.getString(cursor
                                    .getColumnIndex(ContactsContract.Data.DISPLAY_NAME)));
                    contact.putString("photouri", cursor.getString(cursor
                            .getColumnIndex(ContactsContract.Data.PHOTO_URI)));
                    contact.putString("lookup", cursor.getString(cursor
                            .getColumnIndex(ContactsContract.Data.LOOKUP_KEY)));
                    phoneContacts.add(contact);
公共类电话{
公共静态void loadPhoneContacts(上下文,
最终OnPhone联系人SloadedListener(监听器){
最终列表phoneContacts=new ArrayList();
最终字符串[]投影=新字符串[]{contacts contract.Data.\u ID,
Contacts contract.Data.DISPLAY\u NAME,
contacts contract.Data.PHOTO_URI,
Contacts contract.Data.LOOKUP\u键,
Contacts contract.Contacts.HAS_电话号码,
Contacts contract.CommonDataTypes.Phone.NUMBER,
ContactsContract.CommonDataTypes.Im.DATA};
最终字符串选择=“(“+ContactsContract.Data.MIMETYPE+”=\”“
+Contacts contract.CommonDataTypes.Im.CONTENT\u ITEM\u TYPE
+ "\");
游标装入器mCursorLoader=新游标装入器(上下文,
contacts contract.Data.CONTENT\u URI,投影,选择,空,
无效);
mCursorLoader.registerListener(0,新的OnLoadCompleteListener(){
@凌驾
public void onLoadComplete(加载器arg0,光标){
if(游标==null){
返回;
}
while(cursor.moveToNext()){
Bundle contact=新Bundle();
contact.putInt(“phoneid”),cursor.getInt(cursor
.getColumnIndex(contacts contract.Data._ID));
contact.putString(
“显示名称”,
getString(游标
.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
contact.putString(“photouri”),cursor.getString(cursor
.getColumnIndex(ContactsContract.Data.PHOTO_URI));
contact.putString(“查找”),cursor.getString(cursor
.getColumnIndex(ContactsContract.Data.LOOKUP_KEY));
电话联系人。添加(联系人);
for循环如下所示: 此代码位于服务内部

private void loadPhoneContacts() {
    Phoner.loadPhoneContacts(getApplicationContext(),
            new OnPhoneContactsLoadedListener() {
                @Override
                public void onPhoneContactsLoaded(List<Bundle> phoneContacts) {
                    for (Bundle phoneContact : phoneContacts) {
                        for (Account account : accounts) {
                            phoneContact
                                    .getString("photouri");
                            phoneContact
                                    .getString("displayname");
                        }
                    }
                }
            });
}
private void loadPhoneContacts(){
Phoner.loadPhoneContacts(getApplicationContext(),
新的OnPhoneContactsLoadedListener(){
@凌驾
已删除电话联系人的公用无效信息(列出电话联系人){
用于(捆绑电话联系人:电话联系人){
用于(账户:账户){
电话联系
.getString(“photouri”);
电话联系
.getString(“显示名称”);
}
}
}
});
}
附言:我听说过同步适配器,但我不知道它是否能利用那么多的联系人。
谢谢

您是在服务中还是在异步任务中运行此功能?您是在自己的线程中运行服务吗?如果您没有显式声明新线程,请使用主线程,这可以解释您的问题hi@grunk u plz可以解释更多如何显式在新线程中运行它吗?@MikeRoller您只需在您的服务中声明一个新线程即可NathanWalters我已经通过使用游标加载程序和它在AyncTask中运行的for循环完成了这项工作