سؤال

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

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

المحلول

وأعتقد أن هذا ينشأ من وجود تفاوت في كيفية التعامل مع السطح وآخر. عند الخروج من التطبيق LunarLander يتم إتلاف السطح (الاحتجاج surfaceDestroyed) ولكن آخر متوقفة مؤقتا فقط (الاحتجاج onPause). عندما يتم استئناف النشاط يتم إنشاء سطح (الاحتجاج surfaceCreated) ويحاول لبدء موضوع الرسم مرة أخرى.

وهذا يعني أن خلق الموضوع يحدث مع دورة حياة النشاط وتدمير موضوع يحدث مع دورة حياة SurfaceView، والتي لا تتوافق دائما، وبالتالي فإن IllegalThreadStateException. سيكون الحل لربط موضوع لدورة واحدة أو أخرى، ليس على حد سواء.

هذا الموضوع يقترح حلا ممكنا، على الرغم من أنني لا أعرف إذا كان يعمل.

نصائح أخرى

في اختبار بلدي، وأنا خلق موضوع الرسم في طريقة surfaceCreated ()، وهذا لا يحل المشكلة بشكل كامل. هذا هو تطبيق الأسلوب الخاص بي:

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    _thread = new DrawThread(getHolder());
    _thread.setRunning(true);
    _thread.start();
}

وهكذا في رمز، عندما يتم استدعاء surfaceDestroyed()، فإنه يضع mRun إلى false ويدعو thread.join(). يؤدي هذا موضوع لاستكمال ويموت. عند بدء تشغيل التطبيق مرة أخرى ويسمى surfaceCreated()، فإنه يدعو thread.start(). هذا غير صحيح لأن موضوع لا يمكن بدء بعد أن يموت.

وخياران لإصلاح:

وأ) بدء موضوع جديد في surfaceCreated() - على النحو الوارد أعلاه

وب) أو إضافة الاختيار في surfaceDestroyed() ضد Activity.isFinishing() لإنهاء فقط موضوع إذا كان هذا صحيحا. للقيام بذلك، وأنا حاصرت while(mRun) في الموضوع مع حلقة في حين آخر أن يتم تعيين فقط إلى false إذا isFinishing() يعود صحيحا.

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