5

Я пытаюсь воспроизвести звук с R.raw. внутри Thread/Runnable Но я не могу заставить это работать.Контекст внутри 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? Это неважно, что бы я ни старался. Или есть лучший способ сделать это?

ответ

0

Думаю, вам нужно создать Thread и вызвать Thread.start().

0

Вам нужно объявить объект Handler в потоке пользовательского интерфейса.

Затем в тему использовать

YourHandler.post(new Runnable() { 
    public void run() { 
     //do something to the UI (i.e. play something) 
    }}); 
+0

У меня есть обработчик и этот дополнительный Runnable. Но если я хочу получить доступ к этому дополнительному Runnable, мне нужно объявить его как переменную класса, и поэтому нет контекста, а getBaseContext имеет значение null – oggy

+0

Почему нет контекста? Вы можете сохранить его в своем onCreate или прямо перед вашим началом: final Context myContext = ...; или расширить свой обработчик обработчика, такой как YourHandler (Context c) {mGlobalContext = c} ... –

+0

Вот что я пытаюсь выяснить. Если я объявляю переменную класса Context c; и c = getBaseContext(); в методе onCreate я могу распечатать его в методе onCreate, и он дает мне что-то. Если я печатаю контекст в Runnable, он дает мне нуль, независимо от того, что – oggy

12

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

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

Я пробовал это. Но контекст внутри run() Runnable of Thread имеет значение null. Даже с переменной класса. Класс расширяет Activity. – oggy

+0

Спасибо за этот ответ, это помогло мне примерно через месяц задаться вопросом, как это сделать. Спасибо!! – deucalion0

+0

Вам не нужно хранить ссылку на себя в экземпляре. Если вы собираетесь хранить ссылку на активность, было бы правильнее передать ее в runnable, но не хранить 'this' внутри самой активности. «ActivityClass.this» - правильный ответ в этом случае –

17

Вы также можете получить эту ссылку из внешнего класса с помощью MainActivity.this.

+0

Это правильный ответ –

Смежные вопросы