2016-11-02 4 views
0

Ich frage mich, warum mein Code so lange braucht, um zu öffnen. Es dauert gut 2-4 Sekunden auf meinem Android-Gerät (LG G4), um dieses Fragment zu öffnen. Ich habe eine Telefonkontaktklasse mit diesen Variablen, die ich in ihnen abrufen möchte.Wie wird diese Kontaktseite schneller gemacht?

public class PhoneContact { 
    public String contact_name = ""; 
    public String contact_number = ""; 
    public int contact_id = 0; 
} 

Um diese Kontakte aufzublasen, habe ich ein listview-Fragment, das diese Daten anzeigt. Ich zeige das Fragment durch dies zu tun:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle SavedInstanceState){ 
    myFragmentView = inflater.inflate(R.layout.fragment_phonecontacts, container, false); 
    getPhoneContact(); 
    return myFragmentView; 
} 

schließlich um meine Telefonkontakte Informationen Ich tat dies abzurufen:

public void getPhoneContact() { 
    ArrayList<PhoneContact> phoneContacts = new ArrayList<PhoneContact>(); 
    Cursor cursor = null; 
    ContentResolver contentResolver = getActivity().getContentResolver(); 
    try{ 
     cursor = contentResolver.query(
       ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
    } catch (Exception e){ 
     Log.e("Error on contact list", e.getMessage()); 
    } 

    if (cursor.getCount() > 0) { 
     while (cursor.moveToNext()){ 
      PhoneContact phoneContact = new PhoneContact(); 
      String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      phoneContact.contact_name = name; 

      int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))); 
      if (hasPhoneNumber > 0) { 

       Cursor phoneCursor = contentResolver.query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI 
         , null 
         , ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?" 
         , new String[]{id} 
         , null); 

       while (phoneCursor.moveToNext()){ 
        String number = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        phoneContact.contact_number = number; 
       } 
       phoneCursor.close(); 
      } 
      phoneContacts.add(phoneContact); 
     } 
     PhoneContactsAdapter adapter = new PhoneContactsAdapter(this.getContext(), phoneContacts); 
     ListView listView = (ListView) myFragmentView.findViewById(R.id.listview_phoneContacts); 
     listView.setAdapter(adapter); 
    } 
} 

geprüft, ob der Cursor in der Lage, durch die Kontaktdatenbank zu durchqueren. Wenn es dann durch jeden Kontakt gehen und ihre ID, Name, Telefonnummer holen. Sobald es keine Kontakte mehr zu suchen gibt, schließe ich den Cursor und mache dann den Telefonkontakt. Der Home-Kontakt wird dem Array hinzugefügt und bindet dann über einen Adapter an die Listenansicht.

Hat jemand irgendwelche Vorschläge, wie man dies beschleunigt oder eine andere Möglichkeit, meine Telefonkontakte zurückzutreten.

+0

Laden Sie die Kontakte auf App öffnen auf dem Bildschirm, verwenden Sie eine recyclerview, und reduzieren Sie die mehrere Iterationen (while/for). – jturolla

+0

@jturolla irgendwelche Vorschläge, wie Iteration durch Kontakte zu reduzieren? – Shimy

Antwort

0

Ich denke, Sie sollten GetPhoneContact in AsyncTask tun, dann können Sie das Ergebnis über publishPorgress, um nette UX zu haben. Eine weitere, RecyclerView mit notifyItemInserted anstelle von ListView wird eine schöne Animation haben, wenn Kontaktansicht zu Liste hinzufügen

Verwandte Themen