Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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 具有ListView的Android应用程序启动太慢_Java_Android_Listview_Android Sqlite - Fatal编程技术网

Java 具有ListView的Android应用程序启动太慢

Java 具有ListView的Android应用程序启动太慢,java,android,listview,android-sqlite,Java,Android,Listview,Android Sqlite,我正在使用的这个应用程序包括一个SQLLite数据库、一个对PHONE.CONTACTS的查询以及嵌套的while循环,如下所示。它基本上在自定义列表视图中列出手机上的所有联系人。当我测试应用程序时,列表视图大约加载一分钟左右。你能告诉我这背后的原因吗?是因为我在UI线程而不是后台线程上进行查询吗?或者在while循环中使用SQLLite update()方法代价太高?还是因为正则表达式?如果这不是正确的方法,那么你能告诉我正确的方法吗?谢谢你的回答 MainFragment.java: //S

我正在使用的这个应用程序包括一个SQLLite数据库、一个对PHONE.CONTACTS的查询以及嵌套的while循环,如下所示。它基本上在自定义列表视图中列出手机上的所有联系人。当我测试应用程序时,列表视图大约加载一分钟左右。你能告诉我这背后的原因吗?是因为我在UI线程而不是后台线程上进行查询吗?或者在while循环中使用SQLLite update()方法代价太高?还是因为正则表达式?如果这不是正确的方法,那么你能告诉我正确的方法吗?谢谢你的回答

MainFragment.java:

//SINGLETON
personDataList = PersonDataSingleton.getInstance().getPersonDataList();

//DATABASE
db = new DatabaseHelper(getActivity().getApplicationContext());
sqlDbWrite = db.getWritableDatabase();
values = new ContentValues();
ContentValues timeValues = new ContentValues(); 
sqlDbRead = db.getReadableDatabase();

//QUERIES
cursorProjection = new String[]{DatabaseHelper.COLUMN_SOCIAL_POINT, DatabaseHelper.COLUMN_LOOKUP};
cursorTest = sqlDbRead.query(DatabaseHelper.DATABASE_TABLE, cursorProjection, null, null, null, null, DatabaseHelper.COLUMN_SOCIAL_POINT + " DESC");

mProjection = new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_THUMBNAIL_URI};
mCursor = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, mProjection, null, null, null, null);

//COLUMN INDICES
int testStringIndex = cursorTest.getColumnIndexOrThrow(DatabaseHelper.COLUMN_SOCIAL_POINT);
int testContactsNumberIndex = cursorTest.getColumnIndexOrThrow(DatabaseHelper.COLUMN_LOOKUP);
int contactNameIndex = mCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
int contactsNumberIndex = mCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
int mThumbNailUriIndex = mCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI);

//NESTED WHILE LOOPS
cursorTest.moveToPosition(-1);
while (cursorTest.moveToNext())
{
    testString = cursorTest.getInt(testStringIndex);
    String testContactsNumber = cursorTest.getString(testContactsNumberIndex);

    if (subtractPoint > 1)
    {
    testString = testString - daysSince;
    timeValues.put(DatabaseHelper.COLUMN_SOCIAL_POINT, testString);
    sqlDbWrite.update(DatabaseHelper.DATABASE_TABLE, timeValues, DatabaseHelper.COLUMN_LOOKUP + "=?", new String[]{testContactsNumber});
    }

    mCursor.moveToPosition(-1);
    while (mCursor.moveToNext())
    {
    contactName = mCursor.getString(contactNameIndex);
    contactsNumber = mCursor.getString(contactsNumberIndex);               
    mThumbNailUri = mCursor.getString(mThumbNailUriIndex);
    revisedContactsNumber = contactsNumber.replaceAll("\\D+", "");

        if (revisedContactsNumber.equals(testContactsNumber))
        {
        personDataList.add(new PersonData(contactName, contactsNumber, mThumbNailUri, testString, "01"));
        }
    }
}

//ARRAY ADAPTER
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
mCustomAdapter = new CustomAdapter1(getActivity(), personDataList);
setListAdapter(mCustomAdapter);
}
  • 你应该在后台线程中获取联系人
  • 使用RecyclerView查看(可能)如此长的列表
  • 你应该在后台线程中获取联系人
  • 使用RecyclerView查看(可能)如此长的列表
  • 将数据库操作卸载到后台线程,使用LoaderManager实现游标加载程序来完成此操作
  • 处理在LoaderManager实现的OnLoadFinished()回调中更新listAdapter
  • 装载机文档和装载机管理器的使用

    下面是android演练,它使用游标加载程序从联系人提供商检索数据。

  • 将数据库操作卸载到后台线程,使用LoaderManager实现游标加载程序来完成此操作
  • 处理在LoaderManager实现的OnLoadFinished()回调中更新listAdapter
  • 装载机文档和装载机管理器的使用

    下面是android演练,它使用游标加载程序从联系人提供商检索数据。

    尝试添加
    sqlDbWrite.beginTransaction()正好在循环之前,使用
    sqlDbWrite.setTransactionSuccessful()
    sqlDbWrite.endTransaction()循环完成时。您可能还想查看有关交易的更多信息。您到底想要实现什么?@pskink我正在从电话数据库中获取联系人姓名和号码,并拥有自己的自定义数据库和积分,电话号码列。我正在使用嵌套的while循环来匹配自定义数据库和电话联系人数据库之间的电话号码,并据此填充列表。还有一个CallLog DB查询来检查最近的调用,但我没有把CallLog-Own数据库匹配while循环代码放在这里,因为我几乎可以肯定速度慢是因为这个嵌套while循环。我使用RegEx是因为CallLog和Contacs数据库的数字格式不同。这是什么
    自定义的数据库
    用于什么?为什么不使用标准数据库呢?当我说自定义数据库时,我指的是sqllite databasehelper类。抱歉,如果不是正确的术语。我使用这个自定义数据库来存储每个联系人的点。我从CallLog数据库获取呼叫详细信息,并通过while循环将呼叫按号码与此自定义数据库进行匹配,如果已调用号码,则会将一些点添加到自定义数据库中的相关记录中。我还通过带有嵌套while循环的电话号码将此自定义数据库与电话联系人数据库进行匹配,以填充列表视图。您能建议一种更好的方法吗?尝试添加
    sqlDbWrite.beginTransaction()正好在循环之前,使用
    sqlDbWrite.setTransactionSuccessful()
    sqlDbWrite.endTransaction()循环完成时。您可能还想查看有关交易的更多信息。您到底想要实现什么?@pskink我正在从电话数据库中获取联系人姓名和号码,并拥有自己的自定义数据库和积分,电话号码列。我正在使用嵌套的while循环来匹配自定义数据库和电话联系人数据库之间的电话号码,并据此填充列表。还有一个CallLog DB查询来检查最近的调用,但我没有把CallLog-Own数据库匹配while循环代码放在这里,因为我几乎可以肯定速度慢是因为这个嵌套while循环。我使用RegEx是因为CallLog和Contacs数据库的数字格式不同。这是什么
    自定义的数据库
    用于什么?为什么不使用标准数据库呢?当我说自定义数据库时,我指的是sqllite databasehelper类。抱歉,如果不是正确的术语。我使用这个自定义数据库来存储每个联系人的点。我从CallLog数据库获取呼叫详细信息,并通过while循环将呼叫按号码与此自定义数据库进行匹配,如果已调用号码,则会将一些点添加到自定义数据库中的相关记录中。我还通过带有嵌套while循环的电话号码将此自定义数据库与电话联系人数据库进行匹配,以填充列表视图。你能建议一个更好的方法吗?