1

我有一个应用程序以两种不同的方式与其他设备通信:发送声音信号和通过 Wifi 发送消息。为了处理 Wifi 通信,我创建了一个服务,它有一个线程监听广播消息。对于我拥有的声音信号,我也进行了线程监听。所以总共有两个线程,当我想按下按钮时我想杀死它们。

在主 Activity 中,当我按下按钮时调用此方法:

public void onStop() {
        super.onStop();

        mHelloService.stop();
        //This is the Sounds Thread       
        mListenThread = null;                       

        if(D) Log.e(TAG, "-- ON STOP --");
    }

在服务中我有这个功能来停止 Wifi-Thread

public synchronized void stop() {
       System.out.println("Close service");
       if (mHelloThread != null) mHelloThread = null;

    }

我试试这个,但线程继续工作。我读到有人推荐使用的另一个问题:

mHelloThread.interrupt();

但我试过了,我得到了这些错误:

08-30 20:18:08.592: D/AndroidRuntime(7312): 关闭 VM 08-30 20:18:08.592: W/dalvikvm(7312): threadid=1: 线程退出未捕获异常 (group=0x419bc930) 08 -30 20:18:08.592: E/AndroidRuntime(7312): 致命异常: main 08-30 20:18:08.592: E/AndroidRuntime(7312): java.lang.NullPointerException 08-30 20:18:08.592: E /AndroidRuntime(7312): 在 android.nacho.SoundLocalizer.HelloMessage.stop(HelloMessage.java:82) 08-30 20:18:08.592: E/AndroidRuntime(7312): 在 android.nacho.SoundLocalizer.SoundLocalizer.onStop( SoundLocalizer.java:349) 08-30 20:18:08.592: E/AndroidRuntime(7312): 在 android.nacho.SoundLocalizer.SoundLocalizer$3.onClick(SoundLocalizer.java:405) 08-30 20:18:08.592: E /AndroidRuntime(7312): 在 android.view.View.performClick(View.java:4202) 08-30 20:18:08.592: E/AndroidRuntime(7312):在 android.view.View$PerformClick.run(View.java:17340) 08-30 20:18:08.592: E/AndroidRuntime(7312): 在 android.os.Handler.handleCallback(Handler.java:725) 08- 30 20:18:08.592: E/AndroidRuntime(7312): 在 android.os.Handler.dispatchMessage(Handler.java:92) 08-30 20:18:08.592: E/AndroidRuntime(7312): 在 android.os。 Looper.loop(Looper.java:137) 08-30 20:18:08.592: E/AndroidRuntime(7312): 在 android.app.ActivityThread.main(ActivityThread.java:5039) 08-30 20:18:08.592: E/AndroidRuntime(7312): at java.lang.reflect.Method.invokeNative(Native Method) 08-30 20:18:08.592: E/AndroidRuntime(7312): at java.lang.reflect.Method.invoke(Method. java:511) 08-30 20:18:08.592: E/AndroidRuntime(7312): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 08-30 20:18:08.592:E/AndroidRuntime(7312): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 08-30 20:18:08.592: E/AndroidRuntime(7312): 在 dalvik.system.NativeStart.main (本机方法)

你建议我做什么??非常感谢

4

3 回答 3

2

为什么不改变保持线程运行的条件/变量。

于 2013-08-30T21:38:57.543 回答
2

永远不要使用stop(),期间。

interrupt()方法将设置中断标志。您需要实现自己的机制,从而定期检查线程是否被中断并采取适当的措施。

if(isInterrupted()){
    // do something
}

你如何检查一个线程是否被中断?通过使用isInterrupted()方法。

于 2013-08-30T18:45:38.950 回答
1

您将 Thread 设置为 null 是正确的,但您可能误解了此分配的作用;它对 Thread 对象本身没有任何作用。正如 Robin 所说,改变保持线程运行的条件。

考虑以下:

public Something implements Runnable {
    private Thread helloThread;
    public Something() {
        helloThread = new Thread(this);
        helloThread.start();
    }

    @Override
    public void run() {
        while (true && helloThread == Thread.currentThread()) {
            // do something;
        }
    }     
}

当您实例化Something时,它将创建一个新的工作线程并调用该run()方法。它将停留在while循环中,直到条件变为 false。如果设置helloThread = null,它将变为 false,因此将从run()方法返回,线程将自行停止。

于 2013-08-30T22:55:00.557 回答