Android:アクティビティを遅らせることなくバックグラウンドでスレッドを実行する
-
21-12-2019 - |
質問
連絡先情報を引いて、長い時間 - 4秒かかるプロセスがあります。私のアプリでユーザーエクスペリエンスを妨げることを望まない。私は2つの質問があります:
- これを独自のスレッドで実行するにはどうすれば、画面 の描画からアクティビティを遅らせないようにしてください。
- これをスピードアップする方法はありますか?(私はそれを非効率的にやっていますか?)
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
解決
daemon
スレッドを使用することを検討してください。
Daemon
スレッドは通常、アプリケーション/アプレットのサービス( "Fiddley Bits"のロードなど)のサービスを実行するために使用されます。ユーザスレッドとデーモンスレッド間のコアの違いは、すべてのユーザースレッドが終了したときにJVMがプログラムをシャットダウンするだけです。実行のメインスレッドを含めて、ユーザースレッドが実行されなくなった場合、デーモンスレッドはJVMによって終了されます。
p.s。低優先スレッド
です。ソース:
例
Thread thread = new Thread();
thread.setDaemon(true);
thread.start();
.
編集!
この uiのスレッドであるAsyncTask
のlink 背景タスク。
他のヒント
BackgroundスレッドのContentProviderからデータをロードするCursorLoaderの使用:取得連絡先のリスト
所属していません StackOverflow