5

Ich versuche, einen Ton von R.raw zu spielen. in einem Thread/Runable Aber ich kann das nicht zum laufen bringen.Kontext in einem 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 
    } 
    } 

Wie kann ich den echten Kontext innerhalb der Run-Methode erhalten? Es ist null, egal was ich versuche. Oder gibt es einen besseren Weg, dies zu tun?

Antwort

0

Ich denke, Sie müssen einen Thread erstellen und Thread.start() aufrufen.

0

Sie müssen ein Handler-Objekt in Ihrem UI-Thread deklarieren.

Dann in Ihrem Thema

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

Ich habe einen Handler und das zusätzliche Runnable. Aber wenn ich auf diese zusätzliche Runnable zugreifen möchte, muss ich es als eine Klassenvariable deklarieren und so gibt es keinen Kontext und getBaseContext ist null – oggy

+0

Warum gibt es keinen Kontext? Sie können es in Ihrem onCreate oder direkt vor dem Start Ihres Threads speichern: final Context myContext = ...; oder erweitern Sie Ihre Handler-Intializer wie YourHandler (Kontext c) {mGlobalContext = c} ... –

+0

das ist, was ich versuche herauszufinden. Wenn ich eine Klassenvariable Context c deklariere; und mache c = getBaseContext(); in der OnCreate-Methode kann ich es in der OnCreate-Methode ausdrucken und es gibt mir etwas. Wenn ich den Kontext in der Runnable drucke, gibt es mir null, egal was – oggy

12

Sie sollten getBaseContext verwenden verwenden. Stattdessen, wenn diese runnable innerhalb einer Aktivität ist, sollten Sie den Kontext in einer Klassenvariablen speichern, wie folgt aus:

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

Auch sollten Sie nicht in eine Endlosschleife so haben einen Sound immer und immer wieder spielen - sollte es sein ein Schlaf da drinnen, um zu verhindern, dass der Ton in kurzer Zeit immer und immer wieder spielt und sich die gleichen Töne überlagern.

+0

Ich habe das versucht. Aber der Kontext innerhalb der run() der Runnable des Threads ist null. Auch mit der Klassenvariablen. Die Klasse erweitert Aktivität. – oggy

+0

Danke für diese Antwort, es half mir nach etwa einem Monat zu fragen, wie man das macht. Vielen Dank!! – deucalion0

+0

Sie sollten keinen Verweis auf sich selbst in einer Instanz speichern müssen. Wenn Sie eine Referenz auf die Aktivität speichern möchten, ist es korrekter, sie an die ausführbare Datei zu übergeben, aber nicht "this" innerhalb der Aktivität selbst zu speichern. Die 'ActivityClass.this' ist in diesem Fall die richtige Antwort –

17

Sie sollten auch in der Lage sein, diese Referenz von der äußeren Klasse zu erhalten, indem Sie verwenden.

+0

Dies ist die richtige Antwort –

Verwandte Themen