5

Provo a riprodurre un suono da R.raw. inside a Thread/Runnable Ma non riesco a farlo funzionare.Contesto all'interno di un 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 
    } 
    } 

Come posso ottenere il contesto reale all'interno del metodo di esecuzione? È nullo, non importa quello che cerco. O c'è un modo migliore per farlo?

risposta

0

Immagino sia necessario creare una discussione e chiamare Thread.start().

0

È necessario dichiarare un oggetto gestore nel thread dell'interfaccia utente.

Poi, nel tuo Discussione utilizzare

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

Ho un gestore e quel Runnable extra. Ma se voglio accedere a quel Runnable extra ho bisogno di dichiararlo come una variabile di classe e quindi non c'è Context e getBaseContext è null – oggy

+0

Perché non c'è un contesto? Puoi salvarlo sul tuo onCreate o appena prima di iniziare la discussione: final Context myContext = ...; o estendi il tuo intializer gestore come YourHandler (Context c) {mGlobalContext = c} ... –

+0

è quello che sto cercando di capire. Se dichiaro una variabile di classe Contesto c; e fai c = getBaseContext(); nel metodo onCreate posso stamparlo nel metodo onCreate e mi dà qualcosa. Se stampo contesto nel Runnable mi dà nulla, non importa cosa sia – oggy

12

Si dovrebbe usare getBaseContext. Invece, se questo è eseguibile all'interno di un'attività, è necessario memorizzare il contesto in una variabile di classe come questo:

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

Inoltre non dovrebbe avere un ciclo infinito del genere la riproduzione di un suono più e più volte - ci dovrebbe essere un sonno in là per evitare che il suono si riproduca ripetutamente in un breve lasso di tempo e si sovrappongano gli stessi suoni l'uno con l'altro.

+0

L'ho provato. Ma il contesto all'interno di run() del Runnable of the Thread è nullo. Anche con la variabile di classe. La classe estende Attività. – oggy

+0

Grazie per questa risposta mi ha aiutato dopo circa un mese a chiedermi come fare. Grazie!! – deucalion0

+0

Non è necessario memorizzare un riferimento a se stesso all'interno di un'istanza. Se stai per memorizzare un riferimento all'attività, sarebbe più corretto passarlo al runnable, ma non memorizzare 'this' all'interno dell'attività stessa. Il 'ActivityClass.this' è la risposta corretta in questo caso –

17

Si dovrebbe anche essere in grado di ottenere questo riferimento dalla classe esterna utilizzando MainActivity.this.

+0

Questa è la risposta corretta –

Problemi correlati