Arkadaşlar android de geriye doğru saydırma işlemi yapıyorum. Ancak geriye doğru sayarken bir de müzik çaldırmak istiyorum fakat 6 sn sonra uygulama hata veriyor.

 @Override
        public void onTick(long millisUntilFinished) {
                            media = MediaPlayer.create(getApplicationContext(),R.raw.kalp);
                media.start();

        timerText.setText("" + millisUntilFinished/1000+" sn");}

Yukarıdaki kodda ne gibi bir değişiklik yapmam lazım?

soruldu: 06 May '13, 09:26

emax_64's gravatar image

emax_64
64590102101
cevap kabul oranı: 20%


@yatagan 'ın da yazdığı gibi onTick() her çalıştığında MediaPlayer.create(); çağırmak hiç verimli bir yöntem gibi görünmüyor. Hem de konfigürasyonu düşük olan mobil cihazlarda..

MediaPlayer.create(Context context, int resid); kodu aşağıdaki gibi.

/**
     * Convenience method to create a MediaPlayer for a given resource id.
     * On success, {@link #prepare()} will already have been called and must not be called again.
     * <p>When done with the MediaPlayer, you should call  {@link #release()},
     * to free the resources. If not released, too many MediaPlayer instances will
     * result in an exception.</p>
     *
     * @param context the Context to use
     * @param resid the raw resource id (<var>R.raw.&lt;something></var>) for
     *              the resource to use as the datasource
     * @return a MediaPlayer object, or null if creation failed
     */
    public static MediaPlayer create(Context context, int resid) {
        try {
            AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
            if (afd == null) return null;

            MediaPlayer mp = new MediaPlayer();
            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            afd.close();
            mp.prepare();
            return mp;
        } catch (IOException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "create failed:", ex);
           // fall through
        } catch (SecurityException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        }
        return null;
    }

Yani metod her çağrıldığında yeni bir AssetFileDescriptor ve yeni bir MediaPlayer oluşuyor. Bunun yerine MediaPlayer nesnesini global tanımlayıp, source atamasını da bir defa yaparak (her defasında aynı ses dosyasının çalınacağını varsayarak) daha verimli çalışılabilir.

Sanırım buradaki örneği kullanarak yazdın kodu. Aşağıdaki gibi ya da ona benzer bir düzenleme ile çalışacağını düşünüyorum.

public class MyCountDownTimer extends CountDownTimer {
    MediaPlayer media = null;

    public MyCountDownTimer(long startTime, long interval) {
        super(startTime, interval);
        media = MediaPlayer.create(getApplicationContext(), R.raw.kalp);
    }

    @Override
    public void onFinish() {
        text.setText("Time's up!");
    }

    @Override
    public void onTick(long millisUntilFinished) {
        text.setText("" + millisUntilFinished / 1000);
        media.start();
    }
}
permanent link

cevaplandı: 07 May '13, 00:38

OguzOzkeroglu's gravatar image

OguzOzkeroglu
2.5k32939
cevap kabul oranı: 40%

Evet yazdığınız kod çalıştı tşkler yardımınız için.

(07 May '13, 03:32) emax_64 emax_64's gravatar image

Her darbede (onTick) MediaPlayer sınıfından bir tane daha üretiyorsunuz fakat üretilen ve çalışan bu thread'i serbest bırakmıyorsunuz gibi görünüyor. Benzer bir problemi ben de yaşamıştım, 18. defa çalmaya çalıştığımda hata alıyordum. media.start() dedikten sonra media.release() metodunu kullanmayı deneyin. Kaynak kodları bulmaya çalışıyorum, bulduğumda kesin çözümü de yazacağım.

permanent link

cevaplandı: 06 May '13, 14:37

ersinyildiz's gravatar image

ersinyildiz
2.8k31438
cevap kabul oranı: 28%

söylediğinizi denedim bu sefer hiç çalmıyor. İnş bulursunuz kodları.

(06 May '13, 15:30) emax_64 emax_64's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×819

Soruldu: 06 May '13, 09:26

Görüntüleme: 590 kez

Son güncelleme: 07 May '13, 03:32

powered by BitNami OSQA