0

私はアプリ開発の経験はあまりありませんが、すべての電話帳データを読み取って xml ファイルに保存するアプリを作成する必要があります。

私の現在のバージョンは私の電話で実行されています (連絡先は 150 件のみ)。しかし、数千の連絡先を持つデバイスで実行すると、アプリが非常に遅くなります。ボタンをクリックすると、新しい画面が表示されるまでに 1 分近くかかります。

私のアプリの構造はあまり良くないと思います。それが私が現在すべてのデータを読んでいる方法です:

private void 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 に答える