Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Loop线程因NullPointerException崩溃_Java_Android_Multithreading_Looper - Fatal编程技术网

Java Android Loop线程因NullPointerException崩溃

Java Android Loop线程因NullPointerException崩溃,java,android,multithreading,looper,Java,Android,Multithreading,Looper,我试图让一个活套线程工作,但尽管所有的尝试,它崩溃了。我没有使用HandlerThread类,因为我在线程本身中做了很多与802.11相关的事情,并且发布带有大量重复代码的可运行文件似乎不是正确的方法 这里是活套线程类的框架: public class WiFiScanner extends Thread { Looper mLooper; Handler mHandler; @Override public void run() { Loope

我试图让一个活套线程工作,但尽管所有的尝试,它崩溃了。我没有使用HandlerThread类,因为我在线程本身中做了很多与802.11相关的事情,并且发布带有大量重复代码的可运行文件似乎不是正确的方法

这里是活套线程类的框架:

public class WiFiScanner extends Thread {
    Looper mLooper;
    Handler mHandler;

    @Override
    public void run() {
        Looper.prepare();
        synchronized(this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }

        mHandler = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                ..... // message parsing
            }
        }
    }
    /* waits for Looper initialization */
    public boolean waitForLooper() {
        synchronized(this) {
            while(mLooper == null) {
                try {
                    wait();
                } catch (InterruptedException e) {}
            }
        }
        return true;
    }
}
以及在主活动中初始化它的代码:

wifiScanner = new WiFiScanner(
    ... // callback stuff
);
wifiScanner.start();
wifiScanner.waitForLooper();
wifiScanner.initialize();
initialize是WiFiScanner类中的一个简单函数,用于向消息队列发布消息包:

public void initialize() {
    Message msg = mHandler.obtainMessage();
    Bundle b = new Bundle();
    WiFiMsg msgId = WiFiMsg.INITIALIZE;
    b.putSerializable("msgId", msgId);
    msg.obj = b;
    mHandler.sendMessage(msg);
}
尽管waitForLooper()成功返回,但对initialize()的调用会导致空指针异常。我假设looper实际上没有处于将消息分派到队列中的状态,因为waitForLooper()和initialize()之间500毫秒的静态延迟可以避免这个问题

关于如何以合理优雅的方式解决这个问题,有什么想法吗

PS:现在根据流行的需求,堆栈跟踪:

E/AndroidRuntime( 3178):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
E/AndroidRuntime( 3178):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
E/AndroidRuntime( 3178):        at android.app.ActivityThread.access$600(ActivityThread.java:141)
E/AndroidRuntime( 3178):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
E/AndroidRuntime( 3178):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 3178):        at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 3178):        at android.app.ActivityThread.main(ActivityThread.java:5103)
E/AndroidRuntime( 3178):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3178):        at java.lang.reflect.Method.invoke(Method.java:525)
E/AndroidRuntime( 3178):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
E/AndroidRuntime( 3178):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime( 3178):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 3178): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 3178):        at de.uni_leipzig.informatik.rvs.videodownload.wifi.WiFiScanner.initialize(WiFiScanner.java:204)
E/AndroidRuntime( 3178):        at de.uni_leipzig.informatik.rvs.videodownload.MainActivity.onCreate(MainActivity.java:270)
E/AndroidRuntime( 3178):        at android.app.Activity.performCreate(Activity.java:5133)
E/AndroidRuntime( 3178):        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E/AndroidRuntime( 3178):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
E/AndroidRuntime( 3178):        ... 11 more

您的通知应该在设置mHandler之后发出,而不是在mLooper上,因为您的NPE在mHandler上。

您可以添加堆栈跟踪吗?非常感谢。我想我早就试过了,但没有达到预期的效果,但现在它似乎可以正常工作了(至少在非种族条件下)。