آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

خطای null pointer exeption در کار با mediaPlayer (حل شد)

Andronymous  11 سال پیش  11 سال پیش
+2 0

سلام
من توی برنامم از یک ارایه ی یک بعدی از مدیا پلیر استفاده میکنم و مطمن هستم که درست مقدار دهی میکنم 
ولی توی بعضی دستگاه ها به خطای null pointer میرسم (روی امولاتور 4.2.2 مشکلی نیس ولی روی گوشی خودم اندروید 2.3.3 کرش میکنه)
شکل تعریف من اینجوریه:

 public class G extends Application {

    public static MediaPlayer[] soundPlayer        = new MediaPlayer[8];

    public static final int     SOUND_BUBBLE_UP    = 0;
    public static final int     SOUND_BUBBLE_DOWN  = 1;
    public static final int     SOUND_BUBBLE_SHAKE = 2;
    public static final int     SOUND_BUBBLE_CLICK = 3;
    public static final int     SOUND_BUBBLE_PRIZE = 4;
    public static final int     SOUND_GAME_WIN     = 5;
    public static final int     SOUND_GAME_STRESS  = 6;
    public static final int     SOUND_FIRE_END     = 7;


    @Override
    public void onCreate() {
soundPlayer[G.SOUND_BUBBLE_UP] = MediaPlayer.create(G.this, R.raw.bubble_up); soundPlayer[G.SOUND_BUBBLE_DOWN] = MediaPlayer.create(G.this, R.raw.bubble_down); soundPlayer[G.SOUND_BUBBLE_SHAKE] = MediaPlayer.create(G.this, R.raw.bubble_shake); soundPlayer[G.SOUND_BUBBLE_CLICK] = MediaPlayer.create(G.this, R.raw.bubble_click); soundPlayer[G.SOUND_BUBBLE_PRIZE] = MediaPlayer.create(G.this, R.raw.bubble_prize); soundPlayer[G.SOUND_GAME_WIN] = MediaPlayer.create(G.this, R.raw.game_win); soundPlayer[G.SOUND_GAME_STRESS] = MediaPlayer.create(G.this, R.raw.game_stress); soundPlayer[G.SOUND_FIRE_END] = MediaPlayer.create(G.this, R.raw.fire_end_game); super.onCreate(); } public static void playSFX(int order) { switch (order) { case G.SOUND_BUBBLE_UP: if (G.soundPlayer[G.SOUND_BUBBLE_UP].isPlaying()) { G.soundPlayer[G.SOUND_BUBBLE_UP].seekTo(0); } else { G.soundPlayer[G.SOUND_BUBBLE_UP].start(); } break; case G.SOUND_BUBBLE_DOWN: if (G.soundPlayer[G.SOUND_BUBBLE_DOWN].isPlaying()) { G.soundPlayer[G.SOUND_BUBBLE_DOWN].seekTo(0); } else { G.soundPlayer[G.SOUND_BUBBLE_DOWN].start(); } break; case G.SOUND_BUBBLE_SHAKE: if (G.soundPlayer[G.SOUND_BUBBLE_SHAKE].isPlaying()) { G.soundPlayer[G.SOUND_BUBBLE_SHAKE].seekTo(0); } else { G.soundPlayer[G.SOUND_BUBBLE_SHAKE].start(); } break; case G.SOUND_BUBBLE_CLICK: if (G.soundPlayer[G.SOUND_BUBBLE_CLICK].isPlaying()) { G.soundPlayer[G.SOUND_BUBBLE_CLICK].seekTo(0); } else { G.soundPlayer[G.SOUND_BUBBLE_CLICK].start(); } break; case G.SOUND_BUBBLE_PRIZE: if (G.soundPlayer[G.SOUND_BUBBLE_PRIZE].isPlaying()) { G.soundPlayer[G.SOUND_BUBBLE_PRIZE].seekTo(0); } else { G.soundPlayer[G.SOUND_BUBBLE_PRIZE].start(); } break; case G.SOUND_GAME_WIN: if (G.soundPlayer[G.SOUND_GAME_WIN].isPlaying()) { G.soundPlayer[G.SOUND_GAME_WIN].seekTo(0); } else { G.soundPlayer[G.SOUND_GAME_WIN].start(); } break; case G.SOUND_GAME_STRESS: if (G.soundPlayer[G.SOUND_GAME_STRESS].isPlaying()) { G.soundPlayer[G.SOUND_GAME_STRESS].seekTo(0); } else { G.soundPlayer[G.SOUND_GAME_STRESS].start(); } break; case G.SOUND_FIRE_END: if (G.soundPlayer[G.SOUND_FIRE_END].isPlaying()) { G.soundPlayer[G.SOUND_FIRE_END].seekTo(0); } else { G.soundPlayer[G.SOUND_FIRE_END].start(); } break; } } }

و بعد از توی کلاس های مختلف تابع استاتیک playSFX رو صدا میزنم مثلا به این شکل:

  G.playSFX(G.SOUND_FIRE_END);

حالا مشکل عجیب اینجاست که فقط آخرین mediaPlayer ای که اضافه کردم وارد آرایه نمیشه!(با این که آرایه به اندازست!)
و خیلی عجیب تر از اون این که اگر توی onCreate خطی که مربوط به مقدار دهی اخرین mediaPlayer میشه (خط اخر قبل super) رو ببرم و اول onCreate قرار بدم دیگه موقع اجرا این mediaPlayer خطا نمیده ولی دقیقا mediaPlaye قبلیش یعنی :

  
soundPlayer[G.SOUND_GAME_STRESS] = MediaPlayer.create(G.this, R.raw.game_stress);

موقع اجرا null pointer exeption میده!
برای من خیلی عجیبه ولی این اتفاق میفته و من دیشب تا صپ نتونستم حلش کنم از قرار گرفتن فایل های صوتی توی فولدر raw و همینطور نام گذاری صحیح فایل ها هم مطمن هستم!

احتمالا نکته ای وجود داره که من بی اطلاع باشم ازش و دلیل این مشکل باشه؟

مرسی از وقتتون :)

 

0 0
مدیران عزیز چرا این تگ روی سوال من خورد چیش مشکل داشت؟ (11 سال پیش)
+2 0
D: عمدی نبوده اشتباهی زدم، عذر میخوام، انقدر سوالات ناگوار درج میشه که اعصاب نمی مونه و اینجوری میشه. (11 سال پیش)
0 0
خواهش میشه spirit جان شما مدیرین بخواین مارو بیرون کنین هم حرفی نباید بزنیم :دی خودت نظری نداری راجع به جواب سوالم داداش؟ (11 سال پیش)
+2 0
:) خودم سر یه پروژه انقد سروکله زدم با MediaPlayer و خطاهاش که نتیجش معلق شدن پروژه شد، موند برا بعد امتحانات :| (11 سال پیش)
+1 0
پروژه نمونه جناب حسین زاده رو هم نگاه بندازید، بسی حرفه ای هستن ایشون و نکاتی خوبی میشه یاد گرفت لینک (11 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
سامان پاپی  11 سال پیش
0 0

دوست عزیز سلام و خسته نباشید

اگر شما بر روی استفاده از کد های خودتان پافشاری میکنید متاسفانه نمیتوانم کمکی بکنم !

اما اگر قصد ایجاد یک پلیر و بخش چندین اهنگ را دارید (به دلیل اشاره شما به ارایه ) میتوانید از لینک بسیار مفیدو سالم و تست شده ی زیر استفاده بکنید . موفق باشید 

MediaPlayer

0 0
سلام مرسی از لینکی که دادین سورسش کامل و تمیزه کد من هم سینتکس مشابه همین player ای ک معرفی کردین رو داره(ولی یکم ساده تر) و منطقا نباید مشکلی پیش میومد من فقط حدود 10 تا افکت صوتی رو نیاز دارم که پخش کنم توی بازی ای ک در حال ساختش هستم و کدی که در همین حد ساده نوشتم کفایت میکنه !متاسفانه اروری که میگیرم خیلی عجیبه و هیچ جایی شبیهشو ندیدم! (11 سال پیش)
0 0
دوست عزیز ارور در گوگل سرچ کریدن ؟مطمئن باشید یک نفر یک جای دیگه ایی تو دنیا به مشکل شما بر خورده . (11 سال پیش)
0 0
بله نت رو زیرو رو کردم متاسفانه نتیجه ای نگرفتم باز ممنون از توجهتون اقای ادیبی :) (11 سال پیش)
0 0
با سلام. البته من هنوز تا حالا با مبحث مدياپلير كار نكردم. ولي يه نكته به ذهنم رسيد كه بپرسم. شما چرا دستورات تعريف مدياپلير رو قبل از دستور super قرار داديد؟ چرا همه دستورات رو نمي بريد بعد از دستور super . ميشه دليلش رو بگيد كه آيا دليل خاصي داشته يا اينكه فرقي نميكنه. چون توي اموزشهاي استاد همه دستوراتشون رو بعد از دستور super قرار دادند. و نكته ديگه اينكه هر متغير يا متدي كه در كلاس G تعريف ميكنيد توي خود كلاس G براي اشاره كردن بهش نيازي نيست كه اسم G رو اولش بياريد. در اين مورد هم آيا دليل خاصي داريد؟ (11 سال پیش)
0 0
سلام و ارادت آقای اسد شیر راجع به محل قرار گرفتن super که فرمودین راستش دلیل خاصی نداره و توی این مورد چون مقدار دهی این چند mediaPlayer رو توی کلاس های دیگه مثل splashScreen تست کردم میدونم ک تفاوتی ایجاد نمیکنه در کل هم فکر نمیکنم فرقی داشته باشه حداقل من تا حالا به موردی بر نخوردم!مورد دوم هم فقط از روی وسواسیه ک روی یک دست بودن کد دارم ک البته باعث کمتر گیج شدن میشه این اکلیپس اینقدر بلاهای عجیب غریب سر ماها در میاره ک آدم ترجیح میده همیشه خودشو مطمن نگه داره:) (11 سال پیش)
پاسخ به سوال 
Andronymous  11 سال پیش
+3 0

خب مشکل حل شد توضیحاتشو میذارم شاید بعدا به درد دیگران هم بخوره:
توی stackoverflow میگشتم که به اینجمله برخوردم (ترجمش نمیکنم چون انگلیسیم افتضاحه :دی)

Since a number of low-level resources might be allocated for each MediaPlayer,
it could be that if the GC is busy for a while or doesn't run
you'll run out of sound buffers (or whatever) and the MediaPlayer allocation will fail,
returning null.

و ایراد کار من دقیقا همین بود که 8 تا  mediaPlayer درست میکردم و تو کل برنامه اشغالشون میکردم این کار برای گوشی هایی که sound buffer با ظرفیت کمتری دارن باعث null شدن mediaPlayer موقع تخصیص فایل میشه !پس میشه به جای مصرف بی رویه ی بافر صوتی با یک مدیا پلیر (البته به شرط تداخل نداشتن زمان اجرا) چندین افکت صوتی رو پخش کرد که من هر بار قبل از استفاده  به شکل زیر فایل ریسورسش رو  تغیر دادم :

if (soundPlayer[G.SOUND_SHARED] != null) {
        soundPlayer.release();
        soundPlayer = null;
    }

   G.soundPlayer = MediaPlayer.create(G.currentActivity, R.raw.sample_next_music);
   G.soundPlayer.start();

 

+1 0
سلام. بهتون واقعا تبريك ميگم. نكته واقعا تخصصي بوده. و چه نكات ريزي در برنامه نويسي اندرويد وجود داره كه ما تازه كارها فكر نكنم حالا حالاها بهشون برسيم. ممنون بابت اطلاع رساني. مسلما دردسر و زحمت زيادي كشيدين تا بالاخره به نتيجه مطلوب رسيدين. پشتكارتون رو تحسين ميكنم. من توي اولين برنامه ام با نام رقص نور نگران برخورد با مشكل حافظه هستم. آيا در مورد نحوه مديريت حافظه اطلاعاتي دارين. من توي برنامه ام يه اري ليست براي نگهداري افكتها استفاده كردم. هر خونه ارايه يه استرينگ كه مجموعه اي از صفرها و يكهاست. طول اين استرينگ متناسب با تعداد لامپهاي انتخاب شده توسط كاربر متغيره. كه حد ماكزيممش رو خودم توي برنامه تعيين كردم. فرض كنيد كاربر 200 لامپ انتخاب كنه كه ميشه رشته اي از صفر و يكها بطول 200 كاراكتر. حالا ممكنه يك افكت خاص داراي چندين هزار فريم باشه. ميشه يك آرايه اي از چندين هزار رشته به طول 200 كاراكتر. يكي از كاربرام نظر گذاشته بود كه وقتي تعداد اعداد بالا رو براي تنظيمات ست كرده گوشي كرش كرده. اگه در مورد مديريت حافظه در برنامه هاي اندرويد سرنخي داريد ممنون ميشم اطلاع بديد. (11 سال پیش)
0 0
دوست عزیز , به شما گفتم مطمئن باشید یک نفر جای دیگه ایی تو دنیا به مشکل شما برخورده (11 سال پیش)
+1 0
بله جناب ادیبی قطعا همیشه همینطوره فقط این یه مورد گشتن خیلی با دقت تری لازم داشت چون من تو لاگ کت فقط یه null pointer exeption میدیدم و برای این ارور مصداق های خیلی زیادی هست مخصوصا اگر ادم از کد خودش مطمن باشه و ایراد توی نکته ای به این ریزی باشه و متوجه نشه چیه اصلا :) (11 سال پیش)
+1 0
ممنون جناب اسد شیر راستش من هم راجع به مدیریت حافظه اطلاعات به درد بخوری ندارم ولی الان که توضیح دادید که برنامتون چطوریه یه ایده به ذهنم رسید ک ممکنه مصرف حافظه برنامتون رو کاهش بده!شما گفتین که داخل هر خونه از ارایتون یک String هست که داخلش مجموعه ای از صفرو یک ها ذخیره کردین!خب خود String رو میشه به شکل یک آرایه بهش نگاه کرد با این دید شما یک آرایه ی 2 بعدی از صفر و یک ها دارین پس خیلی بهتره که سعی کنین از ارایه ای دو بعدی از boolean ها استفاده کنین قطعا کلاس boolean خیلی خیلی سبک تر از string هست وحافظه کمتری رو اشغال میکنه پس ممکنه تاثیر خوبی داشته باشه روی نتیجه ی کارتون باز میگم این فقط یه ایدست و باید پیاده سازی شه تا میزان تاثیرش معلوم بشه . امیدوارم موفق باشین! (11 سال پیش)
+1 0
بابت همفکری ممنون. روش حتما فکر میکنم. کاشکی میشد برنامه ای گیر آورد که میزان حافظه مصرفی و اشغال شده توسط هر برنامه در حال اجرا رو نشون بده. اینجوری با اجرای برنامه خودم و بررسی میزان حافظه اشغال شده و استفاده از حالتهای مختلف کدنویسی میشد فهمید که کدوم حالت حافظه کمتری رو مصرف میکنه. آیا همچنین برنامه رو احیانا سراغ دارید؟ (11 سال پیش)
0 0
نه متاسفانه همچین چیزی ندیدم تا حالا ولی فک میکنم ساختنش خیلی ساده باشه! (11 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .