9

我尝试播放 R.raw 的声音。在 Thread/Runnable 内部但我无法让它工作。

新的可运行(){
  公共无效运行(){  

    //这给了我一个 NullPointerException,因为 getBaseContext 是 null  
    MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.soundfile);  

    而(真){  
      如果(某事)  
          玩点什么  
    }  
  }

如何在 run 方法中获取真正的上下文?无论我尝试什么,它都是空的。还是有更好的方法来做到这一点?

4

5 回答 5

31

您还应该能够通过使用从外部类获取 this 引用MainActivity.this

于 2014-01-18T22:19:30.867 回答
14

您应该使用 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  
            }  
        }
    }
}

此外,您不应该有一个无限循环,就像一遍又一遍地播放声音 - 那里应该有一个睡眠,以防止声音在很短的时间内一遍又一遍地播放并相互重叠相同的声音.

于 2010-10-06T18:31:20.683 回答
0

我猜你需要创建一个线程并调用 Thread.start()。

于 2010-10-06T18:06:47.373 回答
0

您需要在 UI 线程中声明一个 Handler 对象。

然后在你的线程中使用

YourHandler.post(new Runnable() {
    public void run() {
        //do something to the UI (i.e. play something)
    }});
于 2010-10-06T18:16:05.107 回答
0

这对我有用:

 void doo {
        handler.post(runnable);
 }

 private final Handler handler = new Handler();
 private final Runnable runnable = new Runnable() {
        @Override
        public void run() {
             foo(getApplicationContext());  // do something with Context
        }
 };
于 2022-01-15T13:37:03.963 回答