كيف يمكنني إلغاء تحميل ملف SWF تم تحميله خارجيًا من مكون SWFLoader في Adobe Flex؟

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

سؤال

لدي تطبيق يقوم بتحميل ملفات SWF خارجية وتشغيلها داخل تطبيق Adobe Flex/Air عبر ملف مكون SWFLoader المرن.لقد كنت أحاول إيجاد طريقة لتفريغها من خلال حدث النقر على الزر.لقد بحثت في Google على نطاق واسع، ويبدو أن لا أحد كان قادرًا على القيام بذلك دون اختراق.مجموعة التعليمات البرمجية التي أرى الأشخاص يستخدمونها هي:

swfLoader.source = ""; // Removes the external link to the SWF.
swfLoader.load(null); // Forces the loader to try to load nothing.
// Note: At this point sound from the SWF is still playing, and
// seems to still be playing in memory.
flash.media.SoundMixer.stopAll();
// Stops the sound. This works on my development machine, but not 
// on the client's.

إذا تم إغلاق (إخفاء) ملفات SWF بهذه الطريقة، فسيتعطل البرنامج في النهاية.

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

تحرير 1:لا يمكنني تحرير أفلام SWF الفعلية، حيث يتم إنشاؤها بواسطة العميل.إذا لم أتمكن من إغلاق أي ملف SWF مفتوح من خلال Flex، أليست هذه مشكلة في بنية Flex؟هل خياري الوحيد هو إرسال ملفات SWF إلى متصفح الويب؟

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

المحلول

...أليست هذه مشكلة في بنية Flex؟

نعم هو كذلك، ويؤثر أيضًا على الفلاش بشكل عام.حتى تتمكن من الاستفادة من Loader.unloadAndStop() في FP10 (AIR 1.5)، لا يمكنك ضمان أن المحتوى الذي تم تحميله خارجيًا لن يستمر في استهلاك الذاكرة وموارد وحدة المعالجة المركزية، حتى إذا كنت تستخدم Loader.unload() طريقة.(ولأكون صادقًا، لست متأكدًا بنسبة 100% من أن حتى هذا سيضمن تحرير الموارد، ولكن ربما أكون متشائمًا).

أفضل شيء تالي هو أن تصر على أن منشئي المحتوى الذي تقوم بتحميله يلتزمون بمجموعة من الإرشادات، بما في ذلك الكشف عن شيء مثل dispose() الطريقة التي يمكن لتطبيقك الاتصال بها ليطلب منه تحرير أكبر عدد ممكن من الموارد أمامك unload() هو - هي.إذا لم يكن ذلك ممكنًا، فمن المؤكد تقريبًا أن تطبيقك سوف يتضخم في استخدام الذاكرة ووحدة المعالجة المركزية في كل مرة تقوم فيها بتحميل ملف swf خارجي.آسف.

إذا كان ذلك يجعلك تشعر بتحسن، فأنت لست وحدك.;)

نصائح أخرى

إنها مشكلة أن ملف SWF الذي تم إنشاؤه بشكل سيئ يمكن أن يغرق تطبيقك، وسيتم إصلاح العديد من المشكلات المتعلقة بهذا في Flash Player 10، كما ذكر آخرون.ومع ذلك، بغض النظر عن النظام الأساسي، ستتعرض دائمًا لخطر حدوث مشكلات إذا قمت بتحميل تعليمات برمجية لجهة خارجية، فهناك دائمًا احتمال احتوائها على أخطاء أو تسرب للذاكرة أو تعليمات برمجية ضارة تمامًا.ما لم تتمكن من تحميل المحتوى في وضع الحماية (ولا يمكنك ذلك في Flash، على الأقل حتى الآن)، فإن تحميل الأشياء السيئة سيؤدي إلى إغراق تطبيقك، الأمر بهذه البساطة.

يؤسفني أن أقول إنه ما لم تتمكن من ضمان جودة المحتوى الذي تم تحميله، فلن تتمكن من ضمان جودة التطبيق الخاص بك.يشتهر مطورو Flash بكتابة الأشياء التي تتسرب، أو لا يمكن تفريغها، لأن Flash يجعل من السهل القيام بالأشياء الخاطئة، خاصة بالنسبة للأشياء التي تعيش على الخط الزمني.يعد تحميل أي محتوى Flash لا يمكنك التحكم فيه بشكل مباشر أمرًا محفوفًا بالمخاطر.

الحل الأفضل هو

swfLoader.autoLoad = false;
swfLoader.unloadAndStop();
swfLoader.autoLoad = true;

وبهذه الطريقة تقوم بإيقاف المشغل وتفريغ المحتوى من الذاكرة وتجنب استمرار تشغيل الصوت..هتافات

تكمن المشكلة في ملف swf الذي تم تحميله، فهو ببساطة لا يقوم بتنظيف الصوت بعده.حاول إرفاق حدث إلغاء التحميل في مقاطع الأفلام مثل هذا:

MovieClip(event.target.content).loaderInfo.addEventListener(Event.UNLOAD, unloadMovieClipHandler);
private function unloadMovieClipHandler(event:Event) : void
{
  SoundMixer.stopAll();                           
} 

سأظل عمومًا بعيدًا عن SWFLoader وأستخدم الفئات الموجودة في حزمة mx.modules.

لدى Flex نظام وحدة يمكّن هذا النوع من السلوك.يمكنك التحقق من ذلك هنا : http://livedocs.adobe.com/flex/3/html/help.html?content=modular_3.html .بشكل عام، يعد تحميل مكونات swf وتفريغها ديناميكيًا أمرًا صعبًا، خاصة إذا كانت هذه الوحدات تقوم بتعديل أي حالة عامة في التطبيق (الأنماط، وما إلى ذلك.).ولكن إذا قمت بإنشاء واجهة للوحدات النمطية الخاصة بك، ثم قامت كل فئة تقوم بتحميلها/إلغاء تحميلها بتنفيذ تلك الواجهة بالإضافة إلى توسيع فئة الوحدة النمطية المرنة، فيمكنك تحميلها وإلغاء تحميلها بشكل نظيف.

حاول القيام بما يلي:

try {
   new LocalConnection().connect('foo');
   new LocalConnection().connect('foo');
} catch (e:*) {}

سيؤدي ذلك إلى فرض روتين جمع البيانات المهملة.إذا كان ملف SWF الخاص بك لا يزال متصلاً، فقد فاتك نوع من الاتصال، مثل الصوت.

هناك طريقتان لإجبار GC، وهي طريقة سيئة لأنها تعمل على زيادة وحدة المعالجة المركزية، ولكن الخبر السار هو أن هناك طريقة رسمية قادمة في Flash Player 10:

unloadAndStop

وصلة: http://www.gskinner.com/blog/archives/2008/07/unloadandstop_i.html

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

لم تقم بإظهار كافة التعليمات البرمجية الخاصة بك، لذا سأفترض أنك لم تستخدم طريقة التفريغ الخاصة بفئة Loader.يبدو أيضًا أن swfLoader.load(null) خاطئ بالنسبة لي لأن طريقة التحميل تتوقع كائن URLRequest.عندما تريد تنظيف الأشياء في النهاية، قم بتعيين قيمة الكائن إلى null بدلاً من استدعاء تحميل null.تشير حقيقة استمرار سماع الصوت إلى أنه لم يتم إلغاء تحميل بياناتك، أو أن الملف الصوتي لا يوجد داخل المحتوى الذي تم إلغاء تحميله.دعونا نسير عبر هذا.

المثال أدناه


var loader:Loader = new Loader();
var request:URLRequest = new URLRequest('test.swf');
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfLoad, false, 0, true);

دالة onswfload (e: event): void {addChild (loader) ؛Loader.contentLoaderInfo.addEventListener(Event.UNLOAD, onLoaderUnload, false, 0, true);

Loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onSwfLoad, false);} دالة onloaderUnload (E: Event): void {trace ('تم تفريغ المحمل بنجاح.') ؛} // الآن لإزالة هذا بنقرة زر ، على افتراض أن اسم الأزرار هو button_mc button_mc.addeventListener (mouseevent.mouse_down ، onbuttondown ، false ، 0 ، true) ؛

function onButtonDown(e:MouseEvent):void { loader.unload(); loader.contentLoaderInfo.removeEventListener(Event.UNLOAD, onLoaderUnload); //When you want to remove things completely from memory you simply set their value to null. loader = null; button_mc.removeEventListener(MouseEvent.MOUSE_DOWN, onButtonDown); }

أتمنى أن يكون هذا مفيدًا، وأنا آسف إذا كان زائدًا عن الحاجة، ولكن دون رؤية الكود الخاص بك، ليس لدي أي طريقة لمعرفة كيفية تعاملك مع هذا الأمر بالضبط.

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