2016-04-07 3 views
1

Ich arbeite an einer Instant-Chat-Messaging-Anwendung.Ich bekomme Kontakte vom Telefon und zeigte sie in der Listenansicht einer Aktivität.Aber es dauert 25-30 Sekunden.Ich verwende Mit dem folgenden Code:Kontakte vom Telefon zu bekommen dauert zu viel Zeit

1. Auf klicken Kontakt Button:

contacts.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(getApplicationContext(), "Contacts Clicked", Toast.LENGTH_SHORT).show(); 
       popupWindow.dismiss(); 
       ArrayList<Bean_PhoneNumbers> listBeanPhone = getContactsFromPhone(); 
       Intent intent = new Intent(SingleChatActivity.this, PhoneBookActivity.class); 
       //intent.putExtra("listBeanPhone", listBeanPhone); 
       intent.putParcelableArrayListExtra("listBeanPhone", listBeanPhone); 
       intent.putExtra("friendName", friendName); 
       intent.putExtra("absoluteURL", completeURLFriend); 
       intent.putExtra("friendID", frndID); 
       startActivity(intent); 
      } 
     }); 

2. getContactFromPhone() -Methode

private ArrayList<Bean_PhoneNumbers> getContactsFromPhone() { 

    ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      bean_phoneNumbers = new Bean_PhoneNumbers(); 
      String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
       Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null); 
       while (pCur.moveToNext()) { 
        String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        // Toast.makeText(SingleChatActivity.this, "Name: " + name + ", Phone No: " + phoneNo, Toast.LENGTH_SHORT).show(); 
        bean_phoneNumbers.setName(name); 
        bean_phoneNumbers.setPhoneNumber(phoneNo); 
        listBeanPhoneNumbers.add(bean_phoneNumbers); 
       } 
       pCur.close(); 
      } 

     } 
    } 
    return listBeanPhoneNumbers; 
} 

3.PhoneBookActivity.java

public class PhoneBookActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { 
    private ViewPager viewPager; 
    private SearchView searchView; 
    private ListView listView; 
    private Adapter_PhoneBook adapter_phoneBook; 
    private String friendName, completeURLFriend, frndID; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_phonebook); 

     //findViewByID 
     searchView = (SearchView) findViewById(R.id.search); 
     listView = (ListView) findViewById(R.id.list); 

     // Fetching data from a parcelable object passed from SingleChatActivity 
     ArrayList<Bean_PhoneNumbers> listBeanPhone = getIntent().getParcelableArrayListExtra("listBeanPhone"); 
     for (int i = 0; i < listBeanPhone.size(); i++) { 
      Bean_PhoneNumbers bean = listBeanPhone.get(i); 
      String name = bean.getName(); 
      Log.e("Name", name); 
     } 
     //Initialization 
     adapter_phoneBook = new Adapter_PhoneBook(PhoneBookActivity.this, listBeanPhone); 
     listView.setAdapter(adapter_phoneBook); 
     searchView.setOnQueryTextListener(this); 

     //Getting values from previos screen(ChatFragment) 
     Bundle bundle = getIntent().getExtras(); 
     friendName = bundle.getString("friendsName", null); 
     completeURLFriend = bundle.getString("absoluteURL", null); 
     frndID = bundle.getString("friendID"); 


     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Bean_PhoneNumbers bean_phoneNumbers = (Bean_PhoneNumbers) adapterView.getItemAtPosition(i); 
       Intent intent = new Intent(PhoneBookActivity.this, SingleChatActivity.class); 
       intent.putExtra("bean", bean_phoneNumbers); 
       intent.putExtra("friendName", friendName); 
       intent.putExtra("absoluteURL", completeURLFriend); 
       intent.putExtra("friendID", frndID); 
       startActivity(intent); 
      } 
     }); 


    } 

    @Override 
    public boolean onQueryTextSubmit(String s) { 
     return false; 
    } 

    @Override 
    public boolean onQueryTextChange(String s) { 
     adapter_phoneBook.getFilter().filter(s); 
     return false; 
    } 
} 

Bitte meinen Code überprüfen und mir sagen, wo ich wrong.I tue Kontakte aus dem Telefon ist immer und Speicherung in einem ArrayList.Then i, dass Arraylist zu PhoneBookActivity ist vorbei welches eine listview hat. Ich bevölkere die listview, die einen BaseAdapter verwendet.

+0

in String-Array-Liste konvertieren dann in der Absicht setzen für die Übertragung auf einem anderen activity.try einmal –

+0

Wenn kein Erfolg dann Kontakt aus der Kontaktliste des Benutzers zum ersten Mal holen und es in sqlite speichern. Weil die sqlite App Daten einfacher abrufen kann. Und auch eine Bedingung anwenden, wenn der Benutzer seine Kontaktliste aktualisiert, dann SQLite wird Update auf Datenbanktabelle. –

+0

@MKJParekh: Ich habe meine Frage codereview verschoben. Bitte überprüfen Sie es. –

Antwort

0

ich das Problem behoben haben durch LoaderManager.Following verwendet, ist der Code meiner PhoneBookActivity.java

public class PhoneBookActivity extends AppCompatActivity implements SearchView.OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> { 
    private SearchView searchView; 
    private ListView listView; 
    private Adapter_PhoneBook adapter_phoneBook; 
    private String friendName, completeURLFriend, frndID, roomID, ownerID, group_members, group_name; 
    private String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME; 
    private String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; 
    private Bean_PhoneNumbers bean_phoneNumbers; 
    private List<Bean_PhoneNumbers> listBeanPhoneNumbers; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_phonebook); 

     //findViewByID 
     searchView = (SearchView) findViewById(R.id.search); 
     listView = (ListView) findViewById(R.id.list); 
     searchView.setOnQueryTextListener(this); 
     //Getting values from previos screen(ChatFragment) 
     Bundle bundle = getIntent().getExtras(); 
     friendName = bundle.getString("friendsName", null); 
     // Log.e("FriendName",friendName); 
     completeURLFriend = bundle.getString("absoluteURL", null); 
     //Log.e("CompleteURLFriend",completeURLFriend); 
     frndID = bundle.getString("friendID"); 
     //Log.e("FriendID",frndID); 
     roomID = bundle.getString("GroupRoomID", null); 
     ownerID = bundle.getString("owner_id", null); 
     group_members = bundle.getString("group_members", null); 
     group_name = bundle.getString("group_name", null); 


     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Toast.makeText(getApplicationContext(), "Clicked", Toast.LENGTH_SHORT).show(); 
       Bean_PhoneNumbers bean_phoneNumbers = (Bean_PhoneNumbers) adapterView.getItemAtPosition(i); 

       //On clicking list item ,we can move to either SingleChatActivity or GroupChatActivity 
       //If PhoneBookActivity is started from SingleChatActivity 
       if (friendName != null && completeURLFriend != null && frndID != null) { 
        Intent singleChatIntent = new Intent(PhoneBookActivity.this, SingleChatActivity.class); 
        singleChatIntent.putExtra("bean", bean_phoneNumbers); 
        singleChatIntent.putExtra("friendsName", friendName); 
        singleChatIntent.putExtra("absoluteURL", completeURLFriend); 
        singleChatIntent.putExtra("friendID", frndID); 
        startActivity(singleChatIntent); 
       } 

       //If PhoneBookActivity is started from GroupChatActivity 
       if (roomID != null && ownerID != null && group_members != null && group_name != null) { 
        Intent groupChatIntent = new Intent(PhoneBookActivity.this, GroupChatActivity.class); 
        groupChatIntent.putExtra("bean", bean_phoneNumbers); 
        groupChatIntent.putExtra("GroupRoomID", roomID); 
        groupChatIntent.putExtra("group_members", group_members); 
        groupChatIntent.putExtra("group_name", group_name); 
        groupChatIntent.putExtra("owner_id", ownerID); 


        startActivity(groupChatIntent); 
       } 
      } 
     }); 


     getSupportLoaderManager().initLoader(1, null, this); 

    } 

    @Override 
    public boolean onQueryTextSubmit(String s) { 
     return false; 
    } 

    @Override 
    public boolean onQueryTextChange(String s) { 
     adapter_phoneBook.getFilter().filter(s); 
     return false; 
    } 


    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     Uri CONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
     return new CursorLoader(this, CONTENT_URI, null, null, null, null); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     listBeanPhoneNumbers = new ArrayList<>(); 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      bean_phoneNumbers = new Bean_PhoneNumbers(); 
      bean_phoneNumbers.setName(cursor.getString(cursor.getColumnIndex(DISPLAY_NAME))); 
      bean_phoneNumbers.setPhoneNumber(cursor.getString(cursor.getColumnIndex(NUMBER))); 
      listBeanPhoneNumbers.add(bean_phoneNumbers); 
      cursor.moveToNext(); 
     } 
     adapter_phoneBook = new Adapter_PhoneBook(getApplicationContext(), listBeanPhoneNumbers); 
     listView.setAdapter(adapter_phoneBook); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 

    } 
} 

Diese Aktivität auf, klicken Kontakt Symbol im Einzel Chat/Gruppenchat-Aktivität aufgerufen wird.

contacts.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      dialog.show(); 
      Toast.makeText(getApplicationContext(), "Contacts Clicked", Toast.LENGTH_SHORT).show(); 
      popupWindow.dismiss(); 
      // ArrayList<Bean_PhoneNumbers> listBeanPhone = getContactsFromPhone(); 
      Intent intent = new Intent(GroupChatActivity.this, PhoneBookActivity.class); 
      //intent.putExtra("listBeanPhone", listBeanPhone); 
      // intent.putParcelableArrayListExtra("listBeanPhone", listBeanPhone); 
      intent.putExtra("GroupRoomID", roomID); 
      intent.putExtra("group_members", group_members); 
      intent.putExtra("group_name", group_name); 
      intent.putExtra("owner_id", ownerID); 
      Log.e("rID", roomID); 
      startActivity(intent); 
     } 
    }); 

Der Code ist für mich arbeiten now.Hope es für andere helfen auch .Happy Codierung :-)