سؤال

أنا أواجه موقفًا غريبًا جدًا عند استخدام طريقة packagemanager.getInstalledPackages (). في المرة الأولى التي أقوم فيها بتشغيل نشاطي ، أحصل على قائمة صالحة بجميع الحزم المثبتة. لكن في المرة الثانية التي أطلق فيها نشاطي ، أحصل على قائمة فارغة ... ما الذي يمكن أن يسبب هذا؟

أنا أستخدم هذا الرمز للحصول على القائمة: قائمة pkglist = getPackagemanager (). getInstalledPackages (packagemanager.get_activities) ؛

أنا أبني ضد 1.6 SDK مع التوافق بين 1.5+

شكرًا مقدمًا على أي اقتراحات/مساعدة ... أنا محير حقًا فيما يتعلق بالسبب ولا يمكنني التفكير في ما أفعله خطأ.

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

المحلول

ربما PackageManager يحتاج إلى التذرع في مؤشر ترابط التطبيق الرئيسي ، لسبب ما. لم أحاول استخدامه من AsyncTask.

تحديث 2018-03-26: PackageManager عمومًا على ما يرام للاستدعاء على خيوط الخلفية ، getInstalledPackages() خاصه.

نصائح أخرى

يمكنك الحصول على قائمة فارغة ، لأن Packagemanager توفي ، لأن المخزن المؤقت IPC المستخدم لإرجاع قائمة التطبيقات المثبتة نمت أكبر من حجم المخزن المؤقت 1 ميجابايت (اعتبارًا من 4.4).

منذ API 15 ، فإن نفس السلوك سوف يرمي أ TransactionTooLargeException. على <15 واجهات برمجة التطبيقات ، يتم إرجاع قائمة فارغة فقط وأحيانًا يكون هناك خطأ صغير في logcats.

getInstalledPackages() لا يلزم تنفيذها على موضوع واجهة المستخدم. قد يبدو بهذه الطريقة ، لكن هذا سيكون عرضيًا. إذا قمت بتنفيذها فقط على الخيط الرئيسي ، فلديك التأثير الجانبي الذي يمنع المكالمات المتزامنة التي يمكن أن تملأ المخزن المؤقت لعمليات IPC المشتركة على مستوى العملية.

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