2015-05-13 41 views
2

我嘗試使用TimerTask從服務器api下載數據,任務在後臺應用程序中循環。StopService onDestroy被調用,但服務沒有結束

我有一個服務類:

public class RequestNewInvoice extends Service { 

    private Timer timer; 
    private CheckTask checkTask; 
    private Handler handler; 
    private JSONParser jsonParser; 
    private JSONObject jsonObject; 
    private boolean startService = true; 

    private void init(){  
     this.handler = new Handler(new Handler.Callback() { 
      @Override 
      public boolean handleMessage(Message msg) { 
       Log.e("Message: ",msg.obj+""); 
       return false; 
      } 
     }); 

     this.timer = new Timer(); 
     this.checkTask = new CheckTask(); 
     this.startService = true; 
     timer.scheduleAtFixedRate(checkTask, 5000, 20 * 1000); 
    } 

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

    @Override 
    public int onStartCommand(final Intent intent, int flags, final int startId) { 
     init(); 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.e("SERVICE STOP", "true"); 
     startService = false; 
     checkTask.cancel(); 
     timer.cancel(); 
     timer.purge(); 
    } 

    private class CheckTask extends TimerTask{ 
     @Override 
     public void run() { 
      funcCheckInvoice(); 
     } 
    } 

    public void funcCheckInvoice(){ 
     try{ 
      if(startService){    
       Log.e("SERVICE START", "true"); 
       HttpParams httpParameters = new BasicHttpParams(); 
       HttpConnectionParams.setConnectionTimeout(httpParameters, SuperVAR.GET_CURRENT_SHIPMENT_TIMEOUT); 
       HttpConnectionParams.setSoTimeout(httpParameters, SuperVAR.GET_CURRENT_SHIPMENT_TIMEOUT); 

       httpClient = new DefaultHttpClient(httpParameters); 
       HttpGet httpGet = new HttpGet(SuperVAR.URL_GET_LIST_INVOICE_IN_CURRENT_SHIPMENT+"?"+ URLEncodedUtils.format(_REQUEST, "utf-8")+"unused="+System.currentTimeMillis()/1000); 

       httpGet.setHeader("token",token); 
       httpGet.setHeader("Cache-Control","no-cache"); 
       httpGet.setHeader("Cache-Control","no-store"); 

       HttpResponse httpResponse = httpClient.execute(httpGet); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       jsonObject = jsonParser.getJSONFromRESPONSE(httpEntity); 


       if(jsonObject == null){ 
         Message message = Message.obtain(); 
         message.obj = "get null.... internet like shit T_T"; 
         handler.sendMessage(message); 
       }else { 
         Message message = Message.obtain(); 
         message.obj = "download ok"; 
         handler.sendMessage(message); 
       } 
      }else { 
       Log.e("SERVICE START", "false"); 
       return; 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

當我在活動課運行stopService,服務調用的onDestroy功能,但仍定時器生活在。

如何銷燬計時器任務?

回答

1

使用處理器和銷燬刪除回調任務

TimerTask scanTask; 
    final Handler handler = new Handler(); 
    Timer t = new Timer(); 

    scanTask = new TimerTask() { 
     public void run() { 
      handler.post(task); 
     }}; 
    t.schedule(scanTask, 5000, 20 * 1000); 

    Runnable task = new Runnable() { 
    @Override 
    public void run() { 
      //START YOUR JOB 
      (new FetchData()).execute(); 

    } 
}; 





@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.e("SERVICE STOP", "true"); 
    startService = false; 
    checkTask.cancel(); 
    timer.cancel(); 
    timer.purge(); 
    handler.removeCallbacks(task); 

} 

public class FetchData extends AsyncTask<Void, Void, Void> 
{ 
    @Override 
    protected Void doInBackground(Void... params) 
    { 
      funcCheckInvoice(); 
    } 
} 
+0

在無效運行任務Runnable中,我使用httpclient.excute ..和我得到錯誤.. :(,,謝謝你的幫助 – HoangQBH

+0

什麼是錯誤詳細信息? –

+0

我得到'android.os.NetworkOnMainThreadException' – HoangQBH

0

你已經開始你的服務作爲START_STICKY這可能是你爲什麼 你不能停止服務。

以下是START_STICKY的definition

不斷從onStartCommand(意向,INT,INT)返回:如果當它開始這個 服務的進程被終止(從 onStartCommand(意向,INT,INT)回國後),然後把它留在開始狀態 但不保留此交付的意圖。稍後系統會嘗試 重新創建服務。由於它處於啓動狀態,因此 保證在創建 新服務實例後調用onStartCommand(Intent,int,int);如果沒有任何掛起的啓動命令將 傳送到服務中,則將以空對象 對象調用它,因此您必須小心檢查此操作。

該模式對於明確開始的事物以及 停止運行任意時間段(例如執行背景音樂播放的服務 )有意義。使用START_NOT_STICKY

嘗試,你也需要改變你呼籲取消爲您呼叫 scheduleAtFixedRate的方式。

private ScheduledThreadPoolExecutor scheduleTaskExecutor; 
private ScheduledFuture schedule; 
... 
scheduleTaskExecutor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(5); 
schedule = scheduleTaskExecutor.scheduleAtFixedRate(checkTask, 5000, 20 * 1000); 


@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 
    startService = false; 
    checkTask.cancel(); 

    schedule.cancel(true); 

} 
+0

感謝幫助,但它不是沃金,TimerTask的仍在運行 – HoangQBH

+0

timer.scheduleAtFixedRate(checkTask,5000,20 * 1000);是一個無效函數。schedule是一個ScheduledFuture對象..不能使用=。 – HoangQBH

+0

對不起。我沒有注意到定時器。使用ScheduledThreadPoolExecutor。修改了我的答案。 :) –

相關問題