Android:杀死线程

时间:2013-08-30 18:42:29

标签: android interrupt

我有一个应用程序,它以两种不同的方式与其他设备通信:发送声音信号并通过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(原生方法)

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

3 个答案:

答案 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()方法返回,并且线程将自动停止。