ذكري المظهر:قم بتشغيل سلسلة رسائل في الخلفية دون تأخير النشاط

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

سؤال

لدي عملية سحب معلومات الاتصال، وتستغرق وقتا طويلا - 4 ثواني.لا أريد أن يتعارض ذلك مع تجربة المستخدم في تطبيقي.لدي سؤالين:

  1. كيف يمكنني تشغيل هذا في موضوع خاص به حتى لا يؤخر النشاط من الرسم على الشاشة
  2. هل هناك طريقة لتسريع هذا؟(هل أفعل ذلك بشكل غير فعال؟)

لقد حاولت استدعاء طريقة getContacts() أدناه من onCreate ومن onStart وonResume، ولكن في جميع الحالات لا تظهر الشاشة إلا بعد تشغيل الطريقة بالكامل.

إليك الكود:

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 <String>> ثم أقوم بإدراجها في قاعدة بيانات SQLite.ولكن إذا تمكنت من تشغيله في الخلفية سأكون سعيدًا.

هل كانت مفيدة؟

المحلول

فكر في استخدام أ daemon خيط.

Daemon تُستخدم سلاسل الرسائل عادةً لأداء خدمات للتطبيق/البرنامج الصغير الخاص بك (مثل تحميل "البتات المزعجة").يتمثل الاختلاف الأساسي بين سلاسل رسائل المستخدم وخيوط البرنامج الخفي في أن JVM لن يقوم بإيقاف تشغيل البرنامج إلا عند انتهاء جميع سلاسل رسائل المستخدم.يتم إنهاء سلاسل العمليات Daemon بواسطة JVM عندما لا يكون هناك أي سلاسل عمليات مستخدم قيد التشغيل، بما في ذلك سلسلة العمليات الرئيسية للتنفيذ.

ملاحظة.وهو موضوع ذو أولوية منخفضة

مصادر:

مثال

Thread thread = new Thread();

thread.setDaemon(true);

thread.start();

يحرر!

ألق نظرة على هذا وصلة ل AsyncTask وهو موضوع لمهام خلفية واجهة المستخدم.

نصائح أخرى

فكر في استخدام cursorloader الذي يحمل البيانات من contentprovider في خلفية الخلفية: استرجاعقائمة جهات الاتصال

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top