2

私は小さなアプリケーションを開発しているので、Android 開発の経験を積むことができます。すべての連絡先番号と総メッセージを一覧表示するメソッドを作成しました (GoSMS やデフォルトの SMS アプリケーションと同様)。しかし、私が今直面している問題は、パフォーマンスが遅いことです。以下は、結果を得るために私が行ったことです。

サンプル結果: Mr AAA (10000)

手順:

  1. すべての SMS スレッド ID を取得する
  2. ループして、各スレッド ID に属する合計メッセージを取得します。
  3. そのスレッドに属する連絡先番号を取得します。
  4. その番号と 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: 私は英語のネイティブ スピーカーではないので、質問が理解しやすいように最善を尽くしました。

4

0 に答える 0