2014-06-22 58 views
0

我正在製作一個Android應用程序,當用戶開始輸入電子郵件地址時,他從手機通訊錄中獲取自動填充建議。Android上的聯繫人的電子郵件地址數量是否有限制?

如果我對我的代碼進行限制以僅提取地址,則它工作得很好。如果我沒有任何限制,應用程序會凍結。我沒有試圖提出一個更高的限制,看看它放棄了什麼。

如何優化我的代碼?

private ArrayList<String> getNameEmailDetails() { 
    ArrayList<String> emlRecs = new ArrayList<String>(); 
    **int count = 0;** // THIS IS ADDITIONAL 

    HashSet<String> emlRecsHS = new HashSet<String>(); 
    Context context = getBaseContext(); 
    ContentResolver cr = context.getContentResolver(); 
    String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.Contacts.PHOTO_ID, 
      ContactsContract.CommonDataKinds.Email.DATA, 
      ContactsContract.CommonDataKinds.Photo.CONTACT_ID }; 
    String order = "CASE WHEN " 
      + ContactsContract.Contacts.DISPLAY_NAME 
      + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " 
      + ContactsContract.Contacts.DISPLAY_NAME 
      + ", " 
      + ContactsContract.CommonDataKinds.Email.DATA 
      + " COLLATE NOCASE"; 
    String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''"; 
    Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order); 
    if (cur.moveToFirst()) { 
     do { 
      String emlAddr = cur.getString(3); 

      // keep unique only 
      if (emlRecsHS.add(emlAddr.toLowerCase())) { 
       emlRecs.add(emlAddr); 
       **count++;** // THIS IS ADDITIONAL 
      } 
     } while (cur.moveToNext() **&& count < 100**); 
    } 

    cur.close(); 
    return emlRecs; 
} 

回答

0

您的應用「凍結」,因爲您正在UI線程上執行長時間運行或複雜的計算。這是負責繪製應用視圖並響應用戶輸入的線程。

您應該將此類請求(與所有網絡活動一樣)移動到另一個線程,以防止您的應用程序無響應。

查看ThreadsAsyncTask來解決這些限制。

相關問題