سؤال

لدي تطبيق Android. استنادًا إلى الموقع الجغرافي الحالي للمستخدم ، أريد جلب بعض البيانات عن بُعد في الخلفية وتخزينها. تنفيذي هو:

في فاصل محدد ، يقوم الإنذار بإطلاق خدمتي. تستخدم الخدمة فئة مجهولة للاستعلام عن الموقع الحالي وتسجيل رد اتصال LocationListener. على Call of OnLocationChanged () أقوم ببدء جلب البيانات عن بُعد من الخادم.

ولكن بمجرد الانتهاء من خدمتي في تسجيل مستمع الموقع باستخدام فئة مجهول ، فإنه يعود كما هو متوقع ؛ لأنه لا ينتظر حدوث رد الاتصال قبل الانتهاء. نظرًا لأن رد الاتصال يستغرق بعض الوقت ويجري مكالمة عند إرجاع الخدمة بالفعل ، فإنها ترمي خطأً قائلاً:

java.lang.RuntimeException: Handler{43e82510} sending message to a Handler on a dead thread

وهو أمر مفهوم تمامًا. أحد الحلول السريعة بالنسبة لي الآن هو أنه يمكنني استخدام GetLast -LockningLocation من LocationManager لأن ذلك لا يستجيب مرة أخرى عن طريق رد الاتصال ؛ ولكن ماذا لو كنت أريد أحدث موقع في الوقت الحالي ، في الخدمة وليس النشاط؟ كيف يمكنني الانتظار حتى يحدث رد الاتصال وإيقاف خدمتي من العودة.

أيضا ، في أي نقطة يتم تحديث Last KonfornowLocation؟ في كل مرة يسجل GPS موقعًا جديدًا ؛ هل تحديثها؟ ما أريد أن أعرفه هو أنه إذا لم يكن الأحدث ، فلا يزال بإمكانه إغلاقه إلى الأحدث؟ لأنني لم أر خيارًا في Android Emulator لتكوين الفترة الزمنية بين التحديثات اللاحقة.

أي مساعدة هي محل تقدير كبير. هتافات

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

المحلول

ولكن ماذا لو كنت أريد أحدث موقع في الوقت الحالي ، في الخدمة وليس النشاط؟

آسف ، لكن هذا غير ممكن ، إما في خدمة أو نشاط. على سبيل المثال ، إذا كان راديو GPS متوقفًا ، وكنت تطلب بيانات الموقع من GPS ، فسوف يستغرق الأمر عشرات الثواني فقط للحصول على إصلاح ، وهذا إذا كنت محظوظًا. قد لا تحصل على حل على الإطلاق.

كيف يمكنني الانتظار حتى يحدث رد الاتصال وإيقاف خدمتي من العودة.

لم تكن. أنت تفعل ما قلته ستفعله:

استخدم GetLastknowLocation من موقع LocationManager لأن ذلك لا يستجيب مرة أخرى عن طريق رد الاتصال

لذلك ، لديك الخاص بك Service (الذي نأمل IntentService) تحقق لمعرفة ما إذا كان getLastKnownLocation() يحدث أن يكون له قيمة. إذا كان كذلك ، استخدمه. خلاف ذلك، registerLocationUpdates() باستخدام PendingIntent التي سوف تمر السيطرة مرة أخرى إلى الخاص بك IntentService. عندما تحصل الذي - التي Intent, ، استخدم الموقع و UNGISTER للحصول على التحديثات (على افتراض أن فترة الإنذار لطيفة وطويلة ، مثل ، على سبيل المثال ، مرة واحدة في الساعة).

تصبح الأمور صعبة إذا كان المنبه الخاص بك عبارة عن إنذار _wakeup. ستحتاج بعد ذلك إلى عقد ملف WakeLock, ، وبالتالي فإن الجهاز لا ينام بينما تحاول الحصول على إصلاح GPS. ومع ذلك ، تحتاج إلى إطلاق ذلك WakeLock في وقت ما ، وإذا لم نتمكن من الحصول على إصلاح GPS ... ummm ... حسنًا ، هذا هو الجزء الصعب. محاولة اكتشاف طريقة نظيفة لطيفة للتعامل مع هذا ، وتنفيذها كمكون قابل لإعادة الاستخدام (على سبيل المثال ، LocationAlarmService) ، هو واحد من 18000 عنصر في قائمة المهام الخاصة بي.

أيضا ، في أي نقطة يتم تحديث Last KonfornowLocation؟ في كل مرة يسجل GPS موقعًا جديدًا ؛ هل> تحديثه؟

afaik ، نعم.

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