我想在应用程序中创建一个自动完整的textview,它将读取并显示用户的手机联系人。首先我尝试了here给出的链接,但问题是UI线程中发生了一切,因此我的UI线程会冻结10秒钟。
我看到很多例子,但都发生在UI线程中。
然后经过谷歌搜索后,我找到了cursoradapter的概念并找到了一个非常好的项目here,但问题是这个例子使用了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线程中发生。 我希望它发生在后台线程中。我如何实现这一目标。
还请说明是否有替代方法。
答案 0 :(得分: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);
}