Context inside a Runnable

2019-02-22 05:19发布

问题:

I try to play a sound from R.raw. inside a Thread/Runnable But I can't get this to work.

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  
    }  
  }

How can I get the real Context inside the run method? It is null no matter what I try. Or is there a better way to do this?

回答1:

You should also be able to get the this reference from the outer class by using MainActivity.this.



回答2:

You should use getBaseContext. Instead, if this runnable is within an activity, you should store the context in a class variable like this:

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  
            }  
        }
    }
}

Also you shouldn't have an infinite loop like that playing a sound over and over - there should be a sleep in there in order to prevent the sound from playing over and over in a small amount of time and overlapping the same sounds with each other.



回答3:

I guess you need to create a Thread and call Thread.start().



回答4:

You need to declare a Handler object in your UI thread.

Then in your Thread use

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