3

有人能告诉我为什么这个类在我的主要活动中调用时会返回一个致命的异常吗?

package com.b1ackjosh.kana;

import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.widget.TextView;

public class SoundThread extends Thread  implements Runnable, OnCompletionListener       {

    Thread t = null;
    int place, lvl;
    boolean tStatus = false;
        Context context;

    SoundThread(int l, int p, Context c)  {
        p = place;
        c = context;
        l = lvl;
    };

    public void run() {

         MediaPlayer audioQuestion = MediaPlayer.create(context, QuestionArray.audioArray[lvl][place]);

         audioQuestion.setOnCompletionListener(this);
         audioQuestion.start();

    };

    public void pause() {
        tStatus = false;

        try {
            t.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        t = null;
    }

    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        mp.release();
    }

}

这就是我在主要活动中运行它的方式:

public void playQuizAudio(final int i) {
    new SoundThread(lvl, i, this).start();
}

我只是将一个整数传递给此方法,每次运行它时,我的应用程序都会失败并崩溃到主屏幕。这很烦人,但如果我在我的主要活动中包含相同的代码,它运行良好,但我认为我还有一些其他线程问题,这就是为什么我选择创建一个单独的类来管理它。此外,如果我使用音频中的静态链接,它也会失败,所以我知道它必须是上下文。对此的任何帮助将不胜感激。

这也是我从 LogCat 得到的:

04-12 03:52:43.981: E/AndroidRuntime(3129): FATAL EXCEPTION: Thread-98
04-12 03:52:43.981: E/AndroidRuntime(3129): java.lang.NullPointerException
04-12 03:52:43.981: E/AndroidRuntime(3129):     at android.media.MediaPlayer.create(MediaPlayer.java:731)
04-12 03:52:43.981: E/AndroidRuntime(3129):     at com.b1ackjosh.kana.SoundThread.run(SoundThread.java:23)
4

2 回答 2

1

java.lang.NullPointerException 04-12 03:52:43.981: E/AndroidRuntime(3129): 在 android.media.MediaPlayer.create(MediaPlayer.java:731) 04-12 03:52:43.981: E/AndroidRuntime(3129 ): 在 com.b1ackjosh.kana.SoundThread.run( SoundThread.java:23 )

您在NullPointerException以下行中得到一个:

MediaPlayer audioQuestion = MediaPlayer.create(context, QuestionArray.audioArray[lvl][place]);

假设context,lvlplace变量均设置正确,则 (static) 字段在执行此行时QuestionArray.audioArray可能未初始化(因此)。null

于 2013-04-12T04:12:26.280 回答
1

糟糕,你有:

SoundThread(int l, int p, Context c)  {
    p = place;
    c = context;
    l = lvl;
};

那是背对背!它应该是:

SoundThread(int l, int p, Context c)  {
    place = p;
    context = c;
    lvl = l;
};

编译器应该已经警告过你,所以请注意它。此外:

public class SoundThread extends Thread  implements Runnable

是多余的。选择其中一个,建议通常是Runnable

public class SoundThread implements Runnable
于 2013-04-12T04:21:29.057 回答