0

我对应用程序开发不是很有经验,但我必须编写一个应用程序来读取所有电话簿数据并将其保存到 xml 文件中。

我当前的版本正在我的手机上运行(只有 150 个联系人)。但是当我在有几千个联系人的设备上运行它时,应用程序变得非常慢。当我单击一个按钮时,需要将近一分钟才能显示新屏幕。

我想我的应用程序的结构不是很好。这就是我目前读取所有数据的方式:

私人无效xmlPart2(XmlSerializer序列化程序){

try {

  ContentResolver contentr = getContentResolver();
  Cursor cursor = contentr.query(
      ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

  if (cursor.getCount() > 0) {

    while (cursor.moveToNext()) {

      String id = cursor.getString(cursor
          .getColumnIndex(ContactsContract.Contacts._ID));

      serializer.startTag(null, "Contact");
      serializer.attribute(null, "ID", id);



      Cursor emailCur = contentr.query(
          ContactsContract.CommonDataKinds.Email.CONTENT_URI,
          null,
          ContactsContract.CommonDataKinds.Email.CONTACT_ID
              + " = ?", new String[] { id }, null);

      serializer.startTag(null, "Emails");

      while (emailCur.moveToNext()) {

        String email = emailCur
            .getString(emailCur
                .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

        String emailtype = emailCur
            .getString(emailCur
                .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));

        this.appendNode(serializer, "Email", email, emailtype);
      }

      serializer.endTag(null, "Emails");
      emailCur.close();




      if (Integer
          .parseInt(cursor.getString(cursor
              .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {

        Cursor pCur = contentr
            .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null,
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                    + " = ?", new String[] { id },
                null);

        serializer.startTag(null, "Numbers");

        while (pCur.moveToNext()) {

          String phonenumber = pCur
              .getString(pCur
                  .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
          String phonetype = pCur
              .getString(pCur
                  .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));

          this.appendNode(serializer, "Number", phonenumber,
              phonetype);
        }

        serializer.endTag(null, "Numbers");

        pCur.close();

      }

      serializer.endTag(null, "Contact");
    }
  }

  cursor.close();

} catch (IOException e) {
  e.printStackTrace();
}

}

这只是代码的一部分。在当前代码中,我阅读了以下字段:姓名、地址、电子邮件、组织、便笺、即时通讯工具、网站、昵称和电话号码。

有没有办法优化它?因为它也应该在 API 级别 11 以下工作,所以我不能使用 CursorLoader。

我感谢每一个建议。

4

2 回答 2

1

请在新线程中运行联系人阅读代码。然后调用加载警报(进度条)。联系人获取后,调用处理程序隐藏警报并使用捆绑包将数据传递到下一个屏幕。

于 2012-12-17T09:16:41.147 回答
0

您应该使用AsyncTask,也许您想使用ProgressDialog向用户显示进度

于 2012-12-17T08:58:33.000 回答