作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个从手机加载联系人列表的应用程序,但是根据联系人的数量,这会花费很多时间。我想在后台运行加载联系人列表,这样它就不会减慢应用程序的速度。我正在使用以下函数加载联系信息。
void loadContacts() {
ContentResolver contentResolver=getContentResolver();
Cursor cursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
if(cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Bitmap photo = retrieveContactPhoto(id);
int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
String phoneNumber = null;
if (hasPhoneNumber > 0) {
Cursor cursor2 = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null);
while (cursor2.moveToNext()) {
String ph = cursor2.getString(cursor2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
phoneNumber = ph.replaceAll("\\s", "");
System.out.println(phoneNumber);
}
cursor2.close();
}
if(phoneNumber==null)
continue;
}
}
cursor.close();
}
最佳答案
您需要使用 Loader 来解决您的查询。使用 Loader 会给你带来一些好处。其中之一是:如果用户旋转他们的手机并且 Activity 重新启动,加载程序将被保留(不再需要查询数据库,因为对光标的引用在加载程序中仍然可用),即加载程序是生命周期的意识到的。你需要实现
LoaderManager.LoaderCallbacks<Cursor>
像这样
MyActivity extends AppCompatActivity implements
LoaderManager.LoaderCallbacks<Cursor>{
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
//return a new instance of CursorLoader
return new CursorLoader(this) {
//this reference will be preserved when activity rotates
Cursor myCursor;
@Override
protected void onStartLoading() {
super.onStartLoading();
//myCursor will be null when activity is starting for the first time
if (myCursor== null)
forceLoad();
else
deliverResult(myCursor);
}
@Override
public Cursor loadInBackground() {
//make your database query here
myCursor = getContext().getContentResolver().query()
return myCursor;
}
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
//bind your Cursor to your activity view
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
}
有关更多信息,请查看我的 Udacity Nanodegree 代码 here第 272 - 338 行解释得更好。
关于android - 如何在android后台运行一段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45159764/
我是一名优秀的程序员,十分优秀!