Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中加载大量数据而不让用户等待的最佳方法_Java_Android_Performance_Optimization_Android Contacts - Fatal编程技术网

Java 在android中加载大量数据而不让用户等待的最佳方法

Java 在android中加载大量数据而不让用户等待的最佳方法,java,android,performance,optimization,android-contacts,Java,Android,Performance,Optimization,Android Contacts,我在一个应用程序中工作,该应用程序读取电话联系人并在我的应用程序中使用它们(通话历史记录、常用联系人和所有联系人) 我的UI由选项卡主机控件组成,用户可以在它们之间进行交换,因为我希望我的数据在所有活动中共享,并且只保存在一个地方 因此,我创建了一个名为data controller的单例类,当我打开应用程序时,我会显示加载屏幕,直到加载了所有数据 现在的问题是,当用户有大量联系人时,他们每次打开应用程序都要等待很长时间(1分钟),因此,我如何才能很好地优化代码 编辑 这是我用来获取所有联系人的

我在一个应用程序中工作,该应用程序读取电话联系人并在我的应用程序中使用它们(通话历史记录、常用联系人和所有联系人)

我的UI由选项卡主机控件组成,用户可以在它们之间进行交换,因为我希望我的数据在所有活动中共享,并且只保存在一个地方

因此,我创建了一个名为data controller的单例类,当我打开应用程序时,我会显示加载屏幕,直到加载了所有数据

现在的问题是,当用户有大量联系人时,他们每次打开应用程序都要等待很长时间(1分钟),因此,我如何才能很好地优化代码

编辑

这是我用来获取所有联系人的方法:

public static ArrayList<ContactInfo> getAllContactWithNumberAndNameAndPhoto(
            Context context, boolean starred) {

        ArrayList<ContactInfo> retList = new ArrayList<ContactInfo>();

        ContentResolver cr = context.getContentResolver();

        Cursor cur = null;
        if (starred == true) {
            cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
                    "starred=?", new String[] { "1" }, null);
        } else {

            cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null,
                    null, null);
        }
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {

                ContactInfo item = new ContactInfo();
                String id = cur.getString(cur
                        .getColumnIndex(ContactsContract.Contacts._ID));
                String name = cur
                        .getString(cur
                                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                Uri photo = PhoneUtils.getPhotoUriFromID(context, id);
                String starredValue = cur.getString(cur
                        .getColumnIndex(ContactsContract.Contacts.STARRED));
                boolean isFav = false;
                if (starredValue.equals("1"))
                    isFav = true;

                if (Integer
                        .parseInt(cur.getString(cur
                                .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                    Cursor pCur = cr.query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                    + " = ?", new String[] { id }, null);
                    while (pCur.moveToNext()) {

                        String phoneNo = pCur
                                .getString(pCur
                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        item.addPhone(removeCharactersFromPhoneNumber(phoneNo));
                    }
                    pCur.close();

                    if (photo != null) {

                        item.setPhoto(photo.toString());
                    }

                    item.setName(name);
                    item.setFavorite(isFav);
                    item.setRecent(false);

                    retList.add(item);
                }
            }
            cur.close();
        }

        return retList;
    }
public static ArrayList GetAllContacts with numbers and name and photo(
上下文,布尔型(带星号){
ArrayList retList=新的ArrayList();
ContentResolver cr=context.getContentResolver();
游标cur=null;
如果(带星号==真){
cur=cr.query(ContactsContract.Contacts.CONTENT\u URI,null,
“带星号=?”,新字符串[]{“1”},null);
}否则{
cur=cr.query(ContactsContract.Contacts.CONTENT\u URI,null,null,
空,空);
}
如果(cur.getCount()>0){
while(cur.moveToNext()){
ContactInfo项目=新建ContactInfo();
字符串id=cur.getString(cur
.getColumnIndex(Contacts contract.Contacts._ID));
字符串名称=cur
.getString(cur)
.getColumnIndex(Contacts contract.Contacts.DISPLAY_NAME));
uriphoto=PhoneUtils.getPhotoUriFromID(上下文,id);
String starredValue=cur.getString(cur
.getColumnIndex(Contacts.Contacts.started));
布尔值isFav=false;
如果(星号值等于(“1”))
isFav=真;
if(整数
.parseInt(cur.getString(cur
.getColumnIndex(Contacts contract.Contacts.HAS_PHONE_NUMBER))>0){
游标pCur=cr.query(
ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,
无效的
Contacts contract.CommonDataTypes.Phone.CONTACT\u ID
+“=?”,新字符串[]{id},null);
while(pCur.moveToNext()){
字符串phoneNo=pCur
.getString(pCur)
.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
item.addPhone(从PhoneNumber(phoneNo)中删除字符);
}
pCur.close();
如果(照片!=null){
item.setPhoto(photo.toString());
}
item.setName(名称);
item.setFavorite(isFav);
项目1.2(假);
重新列出。添加(项目);
}
}
cur.close();
}
返回列表;
}

请告诉我是否可以优化此方法。

我很惊讶从设备加载联系人需要这么长时间

您是否分析了应用程序以查看实际花费的时间?这里似乎有问题


如果从系统提供商处加载确实需要那么长的时间(由于操作系统的原因),您可以缓存结果(即放入您自己的SQL db),以便在每次应用程序访问(<1秒)时快速加载并在后台从设备刷新。

我想您方法的瓶颈是照片加载。尝试加载除照片以外的所有内容,然后显示您的活动,同时加载照片


此外,您还可以尝试创建自己的应用程序表,其中只包含所需的数据。因此,在加载联系人时,您将进行较少的选择。但是您必须同步您的表。您可以同时执行此操作。

1分钟!!?也许你的查询效率不高(只获取你想要的列),但如果它是正常的(我不这么认为),你可以获取限制数据(10-20),并且在后台获取越来越多的数据。@shayanpourvatan:我用获取联系人数据的方法更新了帖子,请检查它,并让我知道是否有任何问题。所有的事情都是好的,而不是
PhoneUtils.getPhotoUriFromID(context,id),这需要太长的时间,将此移动到一个线程并在线程中获取图像,向用户显示默认图片并调用
notifyDataSetChanged
刷新图片我看到您没有发布代码,并且分析/找到了瓶颈的src@shayanpourvatan是对的,您应该异步加载视图-您可以在视图中使用hierarchy@shayanpourvatan:好的,这是一个很好的观点,但是我没有在这里加载照片本身,我只是得到URI,所以这就是所有这些问题的原因吗???好主意,我将尝试分析数据,并知道加载所有数据所需的确切时间,然后返回you@AmiraElsayedIsmail这不是一个好方法,因为您每次都必须将联系人数据与
sql
表同步,可能有一个联系人被删除或添加了一个电话号码或更改了图像,或者。。。。,…这是一个最坏的情况,系统联系人提供商引入了长延迟,这不太可能。值得注意的是,这是您在访问某些类型的远程数据时可能使用的方法,即加载时间较长的数据,因此用户在后台更新数据时仍然可以与数据进行交互-这实际上类似于系统联系人在安卓上的工作方式,因为主数据src是