0

我想在应用程序中创建一个自动完成的文本视图,它将读取并显示用户的电话联系人。首先我尝试了这里给出的链接,但问题是 UI 线程中发生的一切,因此我的 UI 线程会冻结 10 秒。

我看到了很多例子,但都发生在 UI 线程中。

然后在谷歌上搜索了很多之后,我来到了 cursoradapter 的概念,发现这里给出了一个非常好的项目,但问题是这个例子使用Contacts.CONTENT_URI了,我无法获得与每个联系人关联的电话号码。我尝试将uri更改为ContactsContract.CommonDataKinds.Phone但没有用。

然后我修改了getitem方法如下:

@Override
public Object getItem(int position) {
    Cursor cursor = (Cursor) super.getItem(position);
    Contact contact = new Contact();

    String imageUri = cursor
            .getString(ContactsQuery.PHOTO_THUMBNAIL_DATA_COLUMN);
    Bitmap bitmap = loadContactPhotoThumbnail(imageUri,
            mDropdownItemHeight);
    if (bitmap == null) {
        bitmap = mLoadingImage;
    }

    contact.id = cursor.getLong(ContactsQuery.ID_COLUMN);

    Cursor phones = mContext.getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "
                    + contact.id, null, null);
    while (phones.moveToNext()) {
        String phoneNumber = phones
                .getString(phones
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        Log.d(TAG, "Number: " + phoneNumber);
    }

    contact.lookupKey = cursor
            .getString(ContactsQuery.LOOKUP_KEY_COLUMN);
    contact.displayName = cursor
            .getString(ContactsQuery.DISPLAY_NAME_COLUMN);
    contact.image = bitmap;

    return contact;
} 

这给了我联系电话,但我猜查询仍然发生在 UI 线程中。我希望它发生在后台线程中。我如何做到这一点。

还请告知是否有替代方法。

4

1 回答 1

0

您可以在方法中写入AsyncTask和检索记录,doInBackgroud然后将适配器设置为自动完成文本视图onPostExecute。可以这样做:

private void loadContacts(){
    AsyncTask<Void, Void, Void> contactsTask = new AsyncTask<Void, Void, Void>(){

        ProgressDialog progressDialog = null;

        @Override
        protected void onPreExecute() {
            final String msg = "Loading Contacts...";
            progressDialog = ProgressDialog.show(mContext, "Contacts", msg);
        }

        @Override
        protected Void doInBackground(Void... params) {

            final String projection[] = { Contacts.DISPLAY_NAME, Phone.NUMBER, "_id" };
            final String selection = null;
            final String[] selectionArgs = null;

            Cursor contactsCursor = mContext.getContentResolver().query(Phone.CONTENT_URI,
                    projection, selection, selectionArgs, null);

            final int[] toResources = {R.id.textView1, R.id.textView2};

            mContactsAdapter = new SimpleCursorAdapter(mContext,
                    R.layout.contacts_row, contactsCursor,
                    projection, toResources,0);

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            progressDialog.dismiss();
            autoCompleteTextView.setAdapter(mContactsAdapter);
        }
    };

    contactsTask.execute(null,null);
}
于 2013-09-18T19:46:49.000 回答