私は小さなアプリケーションを開発しているので、Android 開発の経験を積むことができます。すべての連絡先番号と総メッセージを一覧表示するメソッドを作成しました (GoSMS やデフォルトの SMS アプリケーションと同様)。しかし、私が今直面している問題は、パフォーマンスが遅いことです。以下は、結果を得るために私が行ったことです。
サンプル結果: Mr AAA (10000)
手順:
- すべての SMS スレッド ID を取得する
- ループして、各スレッド ID に属する合計メッセージを取得します。
- そのスレッドに属する連絡先番号を取得します。
- その番号と PhoneLookup を使用して、連絡先の名前を取得します。
メソッドは次のとおりです。
public void populateContactList()
{
// Get all sms threads
Cursor smsAddressCursor = getContentResolver().query(
SMSCVar.CONTENT_URI,
new String[] { "DISTINCT "+SMSCVar.THREAD_ID},
null,
null,
null);
while(smsAddressCursor.moveToNext())
{
Contact c = new Contact();
// Get thread_id
String thread_id = smsAddressCursor.getString(smsAddressCursor.getColumnIndex(SMSCVar.THREAD_ID));
// Get total messages
Cursor totalMessage = getContentResolver().query(
SMSCVar.CONTENT_URI,
new String[] {"count("+SMSCVar.BODY+")"},
SMSCVar.THREAD_ID+" = ?",
new String[] {thread_id},
null);
totalMessage.moveToNext();
c.setNumberOfSMS(totalMessage.getInt(0));
totalMessage.close();
// Get number
Cursor number = getContentResolver().query(
SMSCVar.CONTENT_URI,
new String[] {SMSCVar.ADDRESS},
SMSCVar.THREAD_ID+" = ?",
new String[] {thread_id},
null);
number.moveToNext();
String pNumber = number.getString(0);
number.close();
// Get contact name
Uri uriPhonenumber = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI
, Uri.encode(pNumber));
Cursor contactDisplayName = getContentResolver().query(
uriPhonenumber,
new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME},
null,
null,
null);
// If cursor is not null and has at least one result
if(!contactDisplayName.isNull(0) && contactDisplayName.getCount() > 0)
{
// Get contact name for display
contactDisplayName.moveToNext();
c.setContactName(contactDisplayName
.getString(contactDisplayName
.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)));
}
else
{
// Get contact number for display
c.setContactName(pNumber);
}
// Don't get confuse here, setContactNumber method is not used for display purpose.
c.setContactNumber(pNumber);
contactListAdapter.add(c);
contactDisplayName.close();
}
smsAddressCursor.close();
}
カーソルを適切に閉じるようにコーディングしましたが、まだ GARBAGE COLLECTOR メッセージが表示され、取得に時間がかかります (5 秒)。私の SMS は 11000 メッセージを超えています。
だから私を助けてください!
ありがとうございました!
P/S: 私は英語のネイティブ スピーカーではないので、質問が理解しやすいように最善を尽くしました。