Контекст внутри Runnable - PullRequest
       40

Контекст внутри Runnable

6 голосов
/ 06 октября 2010

Я пытаюсь воспроизвести звук из R.raw. внутри потока / Runnable Но я не могу заставить это работать.

new Runnable(){ 
  public void run() {  

    //this is giving me a NullPointerException, because getBaseContext is null  
    MediaPlayer mp = MediaPlayer.create( getBaseContext(), R.raw.soundfile);  

    while (true) {  
      if (something)  
          play something  
    }  
  }

Как я могу получить реальный контекст внутри метода run? Это ноль, независимо от того, что я пытаюсь. Или есть лучший способ сделать это?

Ответы [ 4 ]

23 голосов
/ 19 января 2014

Вы также должны быть в состоянии получить эту ссылку из внешнего класса, используя MainActivity.this.

13 голосов
/ 06 октября 2010

Вы должны использовать getBaseContext.Вместо этого, если этот runnable находится внутри действия, вы должны сохранить контекст в переменной класса, например:

public class MainActivity extends Activity {
    private Context context;

    public void onCreate( Bundle icicle ) {
        context = this;


        // More Code
    }

    // More code

    new Runnable(){ 
        public void run() {  
            MediaPlayer mp = MediaPlayer.create(context, R.raw.soundfile);  

            while (true) {  
                if (something)  
                    play something  
            }  
        }
    }
}

Также у вас не должно быть бесконечного цикла, подобного этому, воспроизводящего звук снова и сноватам должен быть сон, чтобы звук не проигрывался снова и снова в течение короткого промежутка времени и не перекрывал одни и те же звуки друг с другом.

0 голосов
/ 06 октября 2010

Вам необходимо объявить объект-обработчик в вашем потоке пользовательского интерфейса.

Тогда в вашей теме используйте

YourHandler.post(new Runnable() {
    public void run() {
        //do something to the UI (i.e. play something)
    }});
0 голосов
/ 06 октября 2010

Полагаю, вам нужно создать поток и вызвать Thread.start ().

...