我有一个提取联系信息的流程,需要很长时间 - 4秒。我不希望它干扰我的应用程序中的用户体验。我有两个问题:
我尝试从onCreate,onStart和onResume调用下面的getContacts()方法,但在所有情况下,直到方法完全运行后才会出现屏幕。
以下是代码:
private void getContacts() {
Thread thread = new Thread() {
@Override
public void run() {
try {
Log.d("ManageFriends","getContacts Start");
ContentResolver cr = getContentResolver();
String[] PROJECTION = new String[] {
ContactsContract.CommonDataKinds.Email.CONTACT_ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Email.ADDRESS,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
};
String filter = ContactsContract.CommonDataKinds.Email.ADDRESS + " NOT LIKE '' AND 1 == " +
ContactsContract.Contacts.IN_VISIBLE_GROUP + " AND " +
ContactsContract.Contacts.DISPLAY_NAME + " NOT LIKE '%@%'";
Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, null);
DBHelper.insertArrayList(db,"Contacts",DBHelper.cursorToArrayList(cur));
Log.d("ManageFriends","getContacts End");
}
catch (Exception e) {
e.printStackTrace();
}
}
};
thread.run();
}
注意:我知道这个过程很慢的重要原因 - 我正在将游标结果转换为ArrayList< ArrayList<串GT;>然后将其插入到SQLite数据库中。但如果我能让它在后台工作,我会很高兴。
答案 0 :(得分:1)
考虑使用daemon
线程。
Daemon
个线程通常用于为您的应用程序/ applet执行服务(例如加载" fiddley位")。用户线程和守护程序线程之间的核心区别是,JVM只会在所有用户线程终止时关闭程序。当不再有任何用户线程运行时,守护程序线程由JVM终止,包括执行的主线程。
<强> P.S。这是一个低优先级的线程
来源:
示例强>
Thread thread = new Thread();
thread.setDaemon(true);
thread.start();
修改<!/强>
查看AsyncTask
{{1}}这是一个用于UI后台任务的线程。
答案 1 :(得分:0)
考虑使用CursorLoader从后台线程中的ContentProvider加载数据:Retrieving a List of Contacts