Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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/5/url/2.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 螺纹不';在MainActivity中调用stopService()时,不能停止_Java_Android_Multithreading_Service - Fatal编程技术网

Java 螺纹不';在MainActivity中调用stopService()时,不能停止

Java 螺纹不';在MainActivity中调用stopService()时,不能停止,java,android,multithreading,service,Java,Android,Multithreading,Service,主要活动 public class MainActivity extends ActionBarActivity { Context c=this; Intent i; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button b=(Button)findVi

主要活动

public class MainActivity extends ActionBarActivity {

Context c=this;
Intent i;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button b=(Button)findViewById(R.id.button1);
    Button b1=(Button)findViewById(R.id.button2);

    b.setOnClickListener(new OnClickListener() {

        public void onClick(View v)
        {
        i=new Intent(c,serv.class);
        startService(i);
        }
    });

    b1.setOnClickListener(new OnClickListener()
    {

        public void onClick(View v) {

            stopService(i);

        }
    });
}
}
服务

当我单击按钮停止服务时,会调用ondestroy()消息,但我的线程会继续运行。 日志如下所示:

03-26 16:48:45.065:D/标签(15674):已创建

03-26 16:48:45.065:D/标签(15674):服务已启动

03-26 16:48:45.065:D/标签(15674):正在运行

03-26 16:48:45.495:D/标签(15674):正在运行

03-26 16:48:46.065:D/标签(15674):正在运行

03-26 16:48:46.495:D/标签(15674):正在运行

03-26 16:48:47.065:D/标签(15674):正在运行

03-26 16:48:47.495:D/标签(15674):正在运行

03-26 16:48:48.065:D/标签(15674):正在运行

03-26 16:48:48.505:D/标签(15674):正在运行

03-26 16:48:48.615:D/标签(15674):已销毁

03-26 16:48:49.065:D/标签(15674):正在运行

03-26 16:48:49.495:D/标签(15674):正在运行

试试这个

class bob implements Runnable{
Thread ac;
boolean isRunning = true;
public void run() 
{
    while(isRunning)
    {
        Log.d("tag","RUNNING");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

} 
 public void stopRunning()
{
isRunning = false;
 }

并且在您的服务中引用runnable对象并调用stopRunning()方法…

代码建议了一些共享变量问题。此代码以不适当的方式使用引用。例如,
ac=new-Thread(new-bob())
使用bob()类的新实例引用,但不在
while(true){…}
循环中控制它。此外,使用
while(true)
while(1==1)
是一种不好的做法,因为这会使所有应用程序崩溃。这些都是非常糟糕的代码,可能会产生意想不到的事情

我使用信号量方法重新编写您的示例。在本例中,我定义了一个
私有布尔信号量
变量,用于控制对while循环的访问

需要注意的是,访问
run()
方法是由
isAlive()
方法执行的,它还用于检查销毁操作是否无其他操作

重新编写的代码使用JVM上现有的自然监视器控件。在这种情况下,建议从

Thread.stop()-已弃用。这种方法本质上是不安全的。使用thread.stop停止线程会使其解锁所有已锁定的监视器[…]。stop的许多用法应该被代码所取代,这些代码只是修改一些变量,以指示目标线程应该停止运行。[……]

这种方法可以很容易地适应Android或其他Java环境



看看这个问题,你正在你的服务中创建一个新的线程,你没有停止。。就这样吧running@PreethiRao我正在onDestroy()中停止它,您不应该使用线程。停止()它已被弃用。@PreethiRao那么我应该使用什么?我找到了一个更有效的解决方案,仍然感谢您
class bob implements Runnable{
Thread ac;
boolean isRunning = true;
public void run() 
{
    while(isRunning)
    {
        Log.d("tag","RUNNING");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

} 
 public void stopRunning()
{
isRunning = false;
 }
class MainActivity{
    private Service service;
    public MainActivity(){
        service = new Service();
    }
    public void startService(){
        service.onCreate();
        service.onStartCommand();
    }
    public void stopService(){
        service.onDestroy();

    }
}

class Bob implements Runnable{
    private Boolean semaphore;
    public Bob(){
        this.semaphore = Boolean.FALSE;
    }

    public void active(){
        this.semaphore = Boolean.TRUE;
    }

    public void deactivate(){
        this.semaphore = Boolean.FALSE;
    }

    public Boolean isAlive(){
        return this.semaphore;
    }

    @Override
    public void run() {
        while( isAlive() ){
            System.out.println("RUNNING");
            sleep();
        }
    }

    private void sleep() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) { e.printStackTrace(); }
    }
}
class Service{
    private static final int START_NOT_STICKY = 1;
    private Thread sThread;
    private Bob rBob;

    public Service(){
        this.rBob    = new Bob();
        this.sThread = new Thread( rBob );
    }

    public void onCreate() {
        System.out.println("CREATED");
    }

    public int onStartCommand() {
        System.out.println("SERVICE STARTED");

        rBob.active();
        sThread.start();

        return Service.START_NOT_STICKY;
    }

    public void onDestroy() {
        rBob.deactivate();
        if( sThread.isAlive() && !rBob.isAlive() ) {
            System.out.println("DESTROYED");
        }
    }
}
public class SampleThreadTest {

    public static void main(String a[]) throws InterruptedException {
        MainActivity ma = new MainActivity();

        Thread.sleep(1000);
            ma.startService();
        Thread.sleep(5000);
            ma.stopService();
        Thread.sleep(5000);
    }
}