Android:アクティビティを遅らせることなくバックグラウンドでスレッドを実行する

StackOverflow https://stackoverflow.com//questions/24023098

質問

連絡先情報を引いて、長い時間 - 4秒かかるプロセスがあります。私のアプリでユーザーエクスペリエンスを妨げることを望まない。私は2つの質問があります:

  1. これを独自のスレッドで実行するにはどうすれば、画面
  2. の描画からアクティビティを遅らせないようにしてください。
  3. これをスピードアップする方法はありますか?(私はそれを非効率的にやっていますか?)
  4. 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 >に変換してからSQLite DBに挿入しています。しかし、私がバックグラウンドで働くようになることができれば私は幸せになるだろう。

役に立ちましたか?

解決

daemonスレッドを使用することを検討してください。

Daemonスレッドは通常、アプリケーション/アプレットのサービス( "Fiddley Bits"のロードなど)のサービスを実行するために使用されます。ユーザスレッドとデーモンスレッド間のコアの違いは、すべてのユーザースレッドが終了したときにJVMがプログラムをシャットダウンするだけです。実行のメインスレッドを含めて、ユーザースレッドが実行されなくなった場合、デーモンスレッドはJVMによって終了されます。

p.s。低優先スレッド

です。

ソース:

Thread thread = new Thread();

thread.setDaemon(true);

thread.start();
.

編集!

この uiのスレッドであるAsyncTaskのlink 背景タスク。

他のヒント

BackgroundスレッドのContentProviderからデータをロードするCursorLoaderの使用:取得連絡先のリスト

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top