Android:在后台运行一个线程而不延迟活动

时间:2014-06-03 19:11:26

标签: java android multithreading android-lifecycle android-cursor

我有一个提取联系信息的流程,需要很长时间 - 4秒。我不希望它干扰我的应用程序中的用户体验。我有两个问题:

  1. 如何在自己的线程中运行它,这样就不会延迟活动在屏幕上绘图
  2. 有没有办法加快速度? (我这样做效率不高吗?)
  3. 我尝试从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数据库中。但如果我能让它在后台工作,我会很高兴。

2 个答案:

答案 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