2014-02-24 87 views
0

我在我的MainActivity中有一個選中的按鈕。如果該按鈕被選中,它應該啓動服務,但如果用戶未選中按鈕,我想停止服務。android-如何停止服務中的線程?

所以在取消選中的條件下我寫了這個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(); 
       } 
      } 
     } 
+0

的可能的複製http://stackoverflow.com/questions/4756862/how-to-stop-a-thread和http://stackoverflow.com/questions/5660097/stopping-destroying-a-thread –

+0

[停止服務中的線程]可能的重複(http://stackoverflow.com/questions/14700936/stopping-a-thread-inside-a-service) –

+1

這可能是因爲你只複製粘貼部分代碼,但我不明白爲什麼你需要一個線程在你的例子中:服務本身已經在後臺線程中運行,你可以直接使用它來上傳你的文件(就像你的代碼看起來你只有一個線程可以上傳)你不需要爲此啓動另一個線程。此外,線程中的while循環將無限期地一次又一次地上傳相同的文件。 –

回答

1

無法停止,有一個運行勢不可擋循環這樣

while(true) 
{ 

} 

要停止該線程一個線程,聲明布爾變量並在while-loop條件下使用它。

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(); 

} 

來源:Stopping a thread inside a service

+0

非常感謝 – hellosheikh

0

不要使用線程。改用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(); 
    } 

}