我有一个应用程序,它以两种不同的方式与其他设备通信:发送声音信号并通过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:线程退出 未捕获的异常(组= 0x419bc930)08-30 20:18:08.592: E / AndroidRuntime(7312):致命异常:主08-30 20:18:08.592: E / AndroidRuntime(7312):java.lang.NullPointerException 08-30 20:18:08.592:E / AndroidRuntime(7312):at android.nacho.SoundLocalizer.HelloMessage.stop(HelloMessage.java:82) 08-30 20:18:08.592:E / AndroidRuntime(7312):at android.nacho.SoundLocalizer.SoundLocalizer.onStop(SoundLocalizer.java:349) 08-30 20:18:08.592:E / AndroidRuntime(7312):at android.nacho.SoundLocalizer.SoundLocalizer $ 3.onClick(SoundLocalizer.java:405) 08-30 20:18:08.592:E / AndroidRuntime(7312):at android.view.View.performClick(View.java:4202)08-30 20:18:08.592: E / AndroidRuntime(7312):at android.view.View $ PerformClick.run(View.java:17340)08-30 20:18:08.592:E / AndroidRuntime(7312):at android.os.Handler.handleCallback(Handler.java:725)08-30 20:18:08.592:E / AndroidRuntime(7312):at android.os.Handler.dispatchMessage(Handler.java:92)08-30 20:18:08.592:E / AndroidRuntime(7312):at android.os.Looper.loop(Looper.java:137)08-30 20:18:08.592: E / AndroidRuntime(7312):at 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):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 08-30 20:18:08.592:E / AndroidRuntime(7312):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)08-30 20:18:08.592:E / AndroidRuntime(7312):at dalvik.system.NativeStart.main(原生方法)
你建议我做什么?非常感谢你
答案 0 :(得分:2)
永远不要使用stop()
,句号。
interrupt()
方法将设置中断标志。您需要实现自己的机制,以便定期检查线程是否被中断并采取适当的操作。
if(isInterrupted()){
// do something
}
如何检查线程是否被中断?使用isInterrupted()
方法。
答案 1 :(得分:2)
为什么不改变保持线程运行的条件/变量。
答案 2 :(得分:1)
你将线程设置为null是正确的,但你可能误解了这个任务的作用;它对Thread对象本身没有任何作用。正如罗宾所说,改变保持线程运行的条件。
请考虑以下事项:
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()
方法返回,并且线程将自动停止。