安卓联系人与自动完成文本视图的冲突速度太慢



我正在尝试将ContactsProviderAutoCompleteTextview一起使用,方法是获取数据(姓名和电话号码)并将其存储在列表中。正如预期的那样,这个方法总是需要时间才能完成,就像我在Fragment类的onCreateView方法中调用该方法一样。

这是一种方法:

...
ArrayList<String> phoneValues;
ArrayList<String> nameValues;
...
private void readContactData() {
    try {
        /*********** Reading Contacts Name And Number **********/
        String phoneNumber = "";
        ContentResolver contentResolver = getActivity()
                .getContentResolver();
        //Query to get contact name
        Cursor cursor = contentResolver
                .query(ContactsContract.Contacts.CONTENT_URI,
                        null,
                        null,
                        null,
                        null);
        // If data data found in contacts
        if (cursor.getCount() > 0) {
            int k=0;
            String name = "";
            while (cursor.moveToNext())
            {
                String id = cursor
                        .getString(cursor
                                .getColumnIndex(ContactsContract.Contacts._ID));
                name = cursor
                        .getString(cursor
                                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                //Check contact have phone number
                if (Integer
                        .parseInt(cursor
                                .getString(cursor
                                        .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
                {
                    //Create query to get phone number by contact id
                    Cursor pCur = contentResolver
                            .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                    null,
                                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                            + " = ?",
                                    new String[] { id },
                                    null);
                    int j=0;
                    while (pCur
                            .moveToNext())
                    {
                        // Sometimes get multiple data
                        if(j==0)
                        {
                            // Get Phone number
                            phoneNumber =""+pCur.getString(pCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            // Add contacts names to adapter
                            autocompleteAdapter.add(name);
                            // Add ArrayList names to adapter
                            phoneValues.add(phoneNumber.toString());
                            nameValues.add(name.toString());
                            j++;
                            k++;
                        }
                    }  // End while loop
                    pCur.close();
                } // End if
            }  // End while loop
        } // End Cursor value check
        cursor.close();

    } catch (Exception e) {
        Log.i("AutocompleteContacts","Exception : "+ e);
    }

}

我确信有更好的方法可以实现这一点,但这种方法是有效的,并且在我输入AutocompleteTextview时会给出建议。我只是担心这需要时间。如何在不填充ArrayList的情况下完成此操作?我研究过这个问题:从联系人列表中获取姓名和电子邮件非常慢,并将答案中的建议应用到我的代码中,但现在我键入时没有任何建议。如何提高当前代码的性能?

这就是我实现AutoCompleteTextView的方式,它对我来说很好。。

  final AutoCompleteTextView act=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
         ArrayList<String> alContacts = new ArrayList<String>();
         ArrayList<String> alNames= new ArrayList<String>();
ContentResolver cr = this.getContentResolver(); //Activity/Application android.content.Context
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if(cursor.moveToFirst())
{
    do
    {
        String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        if(Integer.parseInt(cursor.getString(cursor.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 contactNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                String contactName=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                alNames.add(contactName);
                alContacts.add(contactNumber);
                break;
            }
            pCur.close();
        }
    } while (cursor.moveToNext()) ;
}

String[] array=new String[alNames.size()];
array=(String[]) alNames.toArray(array);
ArrayAdapter<String> myArr= new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,array);
act.setAdapter(myArr);
act.setThreshold(1);

我通过将方法放在AsynTask中来消除缓慢的响应。

 public class AutocompleteAsyncTask extends AsyncTask<Void, Void, Void> {

    public Void doInBackground(Void...params) {
        try {
            /*********** Reading Contacts Name And Number **********/
            String phoneNumber = "";
            ContentResolver contentResolver = getActivity()
                    .getContentResolver();
            //Query to get contact name
            Cursor cursor = contentResolver
                    .query(ContactsContract.Contacts.CONTENT_URI,
                            null,
                            null,
                            null,
                            null);
            // If data data found in contacts
            if (cursor.getCount() > 0) {
                int k=0;
                String name = "";
                while (cursor.moveToNext())
                {
            //...Rest of the same code as above

然后在我的onCreateView()中调用它:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
  Bundle savedInstanceState) {
...
  new AutocompleteAsyncTask().execute();
   return rootView;
}

现在,膨胀视图和获取数据的任务被分为两个不同的线程。

Eugen Pechanec提到的CursorLoader选项是最好的选项,所以我会在可能的时候用该选项更新这个答案。

相关内容

  • 没有找到相关文章

最新更新