Android:在后台运行一个线程而不会延迟活动
-
21-12-2019 - |
题
我有一个提取联系信息的过程,需要很长时间 - 4秒。我不希望它干扰我的应用程序中的用户体验。我有2个问题:
- 如何在自己的线程中运行它,因此它不会延迟屏幕上绘制的活动
- 有没有办法加速这一点?(我正在做它效率低下吗?)
我已经尝试从onstart和onresume调用以下oncreate的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
解决方案
考虑使用daemon
线程。
Daemon
线程通常用于为应用程序/ applet执行服务(例如加载“TIFDLY BITS”)。用户线程和守护程序线程之间的核心区别是JVM将仅在所有用户线程终止时关闭程序。当不再运行任何用户线程时,JVM终止守护程序线程,包括执行主线程。
p.s。它是一个低优先级线程
来源:
示例
Thread thread = new Thread();
thread.setDaemon(true);
thread.start();
.
编辑!
签出这个 link
其他提示
请考虑使用currsorloader在后台线程中加载来自contentprovider的数据:检索联系人列表
不隶属于 StackOverflow