0

假設我有一個是從一個BroadcastReceiver稱爲服務:停止其內的AsyncTask前一個服務結束

@Override 
public void onReceive(final Context pContext, Intent pIntent) { 
    String intentAction = pIntent.getAction(); 

    if (intentAction.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) { 
     String state = pIntent.getStringExtra(TelephonyManager.EXTRA_STATE); 
     if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
      Intent intent = new Intent(pContext, OverlayService.class); 
      pContext.startService(intent); 
      return; 
     } 

     if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { 
      Intent intent = new Intent(pContext, OverlayService.class); 
      pContext.stopService(intent); 
      return; 
     } 
    } 
} 

該服務包含內部的AsyncTask其執行的HTTP請求:

@Override 
public int onStartCommand(Intent pIntent, int pFlags, int pStartId) { 
    new HttpTask().execute(getString(R.string.conf_server_url)); 

    return START_STICKY; 
} 

我想知道當用戶決定在任務完成之前掛斷電話會發生什麼。我知道任務將繼續運行直到完成。這是否會造成內存泄漏?我的猜測是,只要任務未完成,服務就無法銷燬。但事後收集?如果沒有,有什麼建議如何解決這個問題?

回答

0

爲什麼不保存一個引用AsyncTask並在服務的onDestroy上調用cancel()方法,或者何時不再需要它?您必須檢查isCancelled(),然後結束任務。

+0

我真的很喜歡這個任務繼續執行直到完成,如果可能的話。我只是不確定這是否會造成內存泄漏,因爲在調用stopService之後服務應該被銷燬,但其後的內部asynctask類仍然處於活動狀態。 –