android-如何停止服务中的线程?

android-如何停止服务中的线程?,android,android-service,Android,Android Service,我的主要活动中有一个选中按钮。如果选中该按钮,则应启动服务,但如果用户未选中该按钮,则我希望停止服务 因此,在取消选中的条件下,我编写了这个stopService(intentname)但问题是服务没有停止。以下是我的代码片段: 服务等级 public class SimpleService extends Service { String selectedAudioPath = ""; private MyThread myythread; public Intent

我的主要活动中有一个选中按钮。如果选中该按钮,则应启动服务,但如果用户未选中该按钮,则我希望停止服务

因此,在取消选中的条件下,我编写了这个
stopService(intentname)但问题是服务没有停止。以下是我的代码片段:

服务等级

public class SimpleService extends Service 
{
    String selectedAudioPath = "";
    private MyThread myythread;
    public Intent intent;
    public boolean isRunning = false;

    long interval=30000;

    @Override
    public IBinder onBind(Intent arg0) 
    {
        return null;
    }

    @Override
    public void onCreate() 
    {
        super.onCreate();
        myythread  = new MyThread(interval);
    }

    @Override
    public synchronized void onDestroy() 
    {
        super.onDestroy();

        if(!isRunning)
        {
            myythread.interrupt();
            myythread.stop();
            isRunning = false;
        }
    }

    @Override
    public synchronized void onStart(Intent intent, int startId) 
    {
        super.onStart(intent, startId);

        if(!isRunning)
        {
            //this.intent = intent;
            //System.out.println("the intent is" + intent);
            myythread.start();
            isRunning = true;
        }
    }

    class MyThread extends Thread
    {
        long interval;
        public MyThread(long interval)
        {
            this.interval=interval;
        }

        @Override
        public void run()
        {
            while(isRunning)
            {
                System.out.println("Service running");
                try 
                {
                    String myString = intent.getStringExtra("name");
                    if(myString == null)
                        Log.d("Service","null");
                    else
                    {
                        Log.d("Service","not null");
                        if(myString.equalsIgnoreCase("image"))
                        {
                            uploadImages();
                            Thread.sleep(interval);
                        }
                        else if(myString.equalsIgnoreCase("audio"))
                        {
                            uploadAudio();
                            Thread.sleep(interval);
                        }
                    }
                } 
                catch (InterruptedException e) 
                {
                    isRunning = false;
                    e.printStackTrace();
                }
            }
        }

你不能停止一个有这样一个不可阻挡的循环的线程

while(true)
{

}
若要停止该线程,请声明一个布尔变量并在while循环条件中使用它

public class MyService extends Service {
      ... 
      private Thread mythread;
      private boolean running;



     @Override
     public void onDestroy()
     {
         running = false;
         super.onDestroy();
     }

     @Override
     public void onStart(Intent intent, int startid) {

         running = true;
       mythread = new Thread() { 
       @Override
       public void run() {
         while(running) {
                   MY CODE TO RUN;
                 }
         }
       };
     };
     mythread.start();

}

来源:

不要使用线程。改为使用AsyncTask

public class MyService extends Service {

    private AsyncTask<Void,Void,Void> myTask;

    @Override
    public void onDestroy(){
         super.onDestroy();
         myTask.cancel(true);
    }

    @Override
    public void onStart(Intent intent, int startid) {
        myTask = new AsyncTask<Void,Void,Void>(){
            @Override
            public void doInBackground(Void aVoid[]){
                doYourWorkHere();
            }
        }
        myTask.execute();
    }

}
公共类MyService扩展服务{
私有异步任务myTask;
@凌驾
公共空间{
super.ondestory();
myTask.cancel(true);
}
@凌驾
公共无效启动(Intent Intent,int startid){
myTask=新的AsyncTask(){
@凌驾
公共作废doInBackground(作废避免[]){
你在这里工作吗;
}
}
myTask.execute();
}
}

可能的重复和可能的重复可能是因为您只复制粘贴的部分代码,但我不知道您为什么需要在示例中使用线程:服务本身已经在后台线程中运行,您可以直接使用它上载文件(从您的代码看,您似乎只有一个线程要上载)你不需要再开始另一个线程。此外,线程中的while循环将一次又一次地无限期地上传同一个文件
真的是故意的吗?@laalto这是我第一次使用..我只是按照教程做的。请添加不应该使用线程而应该使用异步任务的原因。