2012-12-17 141 views
0

我對應用程序開發並不是很有經驗,但是我必須編寫一個應用程序來讀取所有phonebookdata並將其保存到xml文件中。從android手機獲取所有電話簿數據

我目前的版本正在我的手機上運行(只有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。

我很感謝每一個建議。

+0

是這段代碼在主線程中運行嗎? – quinestor

回答

0

您應該使用AsyncTask,也許你想展現的進行使用ProgressDialog

+0

我只是使用AsyncTask將數據發送到服務器。現在我也將整個閱讀代碼放在AsyncTask中,它運行時沒有問題。謝謝!! – user1778772

1

請運行該聯繫人在新的線程讀取代碼的用戶。然後調用加載警報(進度條)。聯繫人獲取調用處理程序以隱藏臨時提示並使用包將數據傳遞到下一個屏幕後。