5

我嘗試從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 
    } 
    } 

如何獲得運行方法中的真實上下文?無論我嘗試什麼,它都是空的。還是有更好的方法來做到這一點?

回答

0

我想你需要創建一個線程並調用Thread.start()。

0

你需要在你的UI線程中聲明一個Handler對象。

然後在你的線程中使用

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

我有一個處理程序和額外的Runnable。但是,如果我想訪問額外的Runnable,我需要將它聲明爲一個類變量,所以沒有Context和getBaseContext爲null – oggy 2010-10-06 18:42:36

+0

爲什麼沒有上下文?你可以將它保存在你的onCreate中,或者在開始你的線程之前:final Context myContext = ...;或者像YourHandler(Context c){mGlobalContext = c} ... – 2010-10-06 18:55:07

+0

這樣擴展你的處理器初始化程序,這就是我想要弄清楚的。如果我聲明一個類變量Context c;並做c = getBaseContext();在onCreate方法中,我可以在onCreate方法中打印出來,它給了我一些東西。如果我在Runnable中打印上下文,它會給我null,無論是什麼 – oggy 2010-10-06 19:10:53

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

我試過了。但是線程的Runnable的run()內部的上下文是空的。即使是類變量。該類擴展了Activity。 – oggy 2010-10-06 18:40:56

+0

感謝這個答案,大約一個月後,我想知道如何做到這一點。謝謝!! – deucalion0 2013-03-23 09:01:03

+0

您不應該在實例中存儲對自身的引用。如果您要存儲對活動的引用,將它傳遞給runnable會更加正確,但不會將「this」存儲在活動本身內。在這種情況下,'ActivityClass.this'是正確的答案 – 2017-05-04 22:01:36

17

您還應該能夠通過使用MainActivity.this從外部類獲得此參考。

+0

這是正確的答案 – 2017-05-04 22:00:07