Detener el método AsincrTask doInBackground

He creado una AsyncTask en una clase y estoy llamando a esa tarea desde un fragmento. El problema es que quiero detener el método doInBackground si el fragmento se destruye. Para hacer eso, creé un método en la clase donde se escribe AsyncTask y utilicé cancelar (verdadero) en el objeto Asynctask en ese método. Cuando llamo a este método desde los fragmentos onDestroy (), el proceso en segundo plano aún se está ejecutando. Por favor, dime la forma correcta de detener el doInBackground de asynctask.

Esta es la clase donde se escribe asynctask

public class CarDetail implements Parcelable{ private String carId; private String carName; private String imageUrl; private String thumbUrl; private String dailyPrice; private String weeklyPrice; private String weekendPrice; private String deposit; private String minimumAge; private String color; private String make; private String location; private String bodyType; private String fuelType; private String transmission; private String carType; private String model; private String description; private Bitmap image; private Bitmap thumbImage; private CarListAdapter carAdapter; private ImageLoadTask task = new ImageLoadTask(); public CarDetail() { super(); // TODO Auto-generated constructor stub } public CarDetail(String carId, String carName, String imageUrl, String thumbUrl, String dailyPrice, String weeklyPrice, String weekendPrice, String deposit, String minimumAge, String color, String make, String location, String bodyType, String fuelType, String transmission, String carType, String model, String description) { super(); this.carId = carId; this.carName = carName; this.imageUrl = imageUrl; this.thumbUrl = thumbUrl; this.dailyPrice = dailyPrice; this.weeklyPrice = weeklyPrice; this.weekendPrice = weekendPrice; this.deposit = deposit; this.minimumAge = minimumAge; this.color = color; this.make = make; this.location = location; this.bodyType = bodyType; this.fuelType = fuelType; this.transmission = transmission; this.carType = carType; this.model = model; this.description = description; // TO BE LOADED LATER - OR CAN SET TO A DEFAULT IMAGE this.image = null; this.thumbImage = null; } public String getCarId() { return carId; } public void setCarId(String carId) { this.carId = carId; } public String getCarName() { return carName; } public void setCarName(String carName) { this.carName = carName; } public String getImageUrl() { return imageUrl; } public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; } public String getThumbUrl() { return thumbUrl; } public void setThumbUrl(String thumbUrl) { this.thumbUrl = thumbUrl; } public String getDailyPrice() { return dailyPrice; } public void setDailyPrice(String dailyPrice) { this.dailyPrice = dailyPrice; } public String getWeeklyPrice() { return weeklyPrice; } public void setWeeklyPrice(String weeklyPrice) { this.weeklyPrice = weeklyPrice; } public String getWeekendPrice() { return weekendPrice; } public void setWeekendPrice(String weekendPrice) { this.weekendPrice = weekendPrice; } public String getDeposit() { return deposit; } public void setDeposit(String deposit) { this.deposit = deposit; } public String getMinimumAge() { return minimumAge; } public void setMinimumAge(String minimumAge) { this.minimumAge = minimumAge; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public String getMake() { return make; } public void setMake(String make) { this.make = make; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public String getBodyType() { return bodyType; } public void setBodyType(String bodyType) { this.bodyType = bodyType; } public String getFuelType() { return fuelType; } public void setFuelType(String fuelType) { this.fuelType = fuelType; } public String getTransmission() { return transmission; } public void setTransmission(String transmission) { this.transmission = transmission; } public String getCarType() { return carType; } public void setCarType(String carType) { this.carType = carType; } public String getModel() { return model; } public void setModel(String model) { this.model = model; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Bitmap getImage() { return image; } public void setImage(Bitmap image) { this.image = image; } public Bitmap getThumbImage() { return thumbImage; } public void setThumbImage(Bitmap thumbImage) { this.thumbImage = thumbImage; } public void loadImage(CarListAdapter carAdapter) { // HOLD A REFERENCE TO THE ADAPTER this.carAdapter = carAdapter; if (thumbUrl != null && !thumbUrl.equals("")) { //new ImageLoadTask().execute(thumbUrl); task.execute(thumbUrl); } } // ASYNC TASK TO AVOID CHOKING UP UI THREAD private class ImageLoadTask extends AsyncTask { @Override protected void onPreExecute() { Log.i("ImageLoadTask", "Loading image..."); } // PARAM[0] IS IMG URL protected Bitmap doInBackground(String... param) { Log.i("ImageLoadTask", "Attempting to load image URL: " + param[0]); try { Bitmap b = JsonParser.downloadBitmap(param[0]); return b; } catch (Exception e) { e.printStackTrace(); return null; } } protected void onProgressUpdate(String... progress) { // NO OP } protected void onPostExecute(Bitmap ret) { if (ret != null) { Log.i("ImageLoadTask", "Successfully loaded " + carName + " image"); image = ret; if (carAdapter != null) { // WHEN IMAGE IS LOADED NOTIFY THE ADAPTER carAdapter.notifyDataSetChanged(); } } else { Log.e("ImageLoadTask", "Failed to load " + carName + " image"); } } } /* everything below here is for implementing Parcelable */ // 99.9% of the time you can just ignore this public int describeContents() { return 0; } // write your object's data to the passed-in Parcel public void writeToParcel(Parcel out, int flags) { out.writeString(carId); out.writeString(carName); out.writeString(imageUrl); out.writeString(thumbUrl); out.writeString(dailyPrice); out.writeString(weeklyPrice); out.writeString(weekendPrice); out.writeString(deposit); out.writeString(minimumAge); out.writeString(color); out.writeString(make); out.writeString(location); out.writeString(bodyType); out.writeString(fuelType); out.writeString(transmission); out.writeString(carType); out.writeString(model); out.writeString(description); } // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public CarDetail createFromParcel(Parcel in) { return new CarDetail(in); } public CarDetail[] newArray(int size) { return new CarDetail[size]; } }; // example constructor that takes a Parcel and gives you an object populated with it's values private CarDetail(Parcel in) { carId = in.readString(); carName = in.readString(); imageUrl = in.readString(); thumbUrl = in.readString(); dailyPrice = in.readString(); weeklyPrice = in.readString(); weekendPrice = in.readString(); deposit = in.readString(); minimumAge = in.readString(); color = in.readString(); make = in.readString(); location = in.readString(); bodyType = in.readString(); fuelType = in.readString(); transmission = in.readString(); carType = in.readString(); model = in.readString(); description = in.readString(); } public void stopImageLoadTask(){ task.cancel(true); Log.d("stop", "stop"); } 

Este es el fragmento

  public class ServiceCarListFragment extends Fragment { private String url; private ArrayList carDetailList = new ArrayList(); private CarListAdapter adapter; private ListView mList ; private ProgressDialog progressDialog; OnCarListItemSelectedListener mCallback; private boolean connectionStatus; // Container Activity must implement this interface public interface OnCarListItemSelectedListener { public void onCarSelected(CarDetail car); } @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { mCallback = (OnCarListItemSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnCarListItemSelectedListener"); } } @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Log.d("Services", "On Create"); url = getActivity().getIntent().getStringExtra("url"); adapter = new CarListAdapter(getActivity() , carDetailList); ConnectionHandler conn = new ConnectionHandler(); connectionStatus = conn.connectionStatus(getActivity()); if(connectionStatus){ new DownloadCarDetail().execute(url); } else{ DialogFragment newFragment = new DialogHandler(getActivity()); newFragment.show(getFragmentManager(), "internet"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub Log.d("Services", "On CreateView"); View v = inflater.inflate(R.layout.fragment_service_car_list, container,false); mList = (ListView)v.findViewById(R.id.list); mList.setAdapter(adapter); mList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View selectedView, int position, long id) { // TODO Auto-generated method stub CarDetail car = (CarDetail)adapter.getItem(position); mCallback.onCarSelected(car); } }); return v; } class DownloadCarDetail extends AsyncTask<String, String, ArrayList>{ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); progressDialog = ProgressDialog.show(getActivity(), null, "Loading...",true); } @Override protected ArrayList doInBackground(String... params) { // TODO Auto-generated method stub ArrayList carDetailList = JsonParser.parseJson(params[0]); return carDetailList; } @Override protected void onPostExecute(ArrayList carDetailList) { // TODO Auto-generated method stub //adapter = new CarListAdapter(getActivity(),ServiceCarListFragment.this.carDetailList); //mList.setAdapter(adapter); progressDialog.dismiss(); ServiceCarListFragment.this.carDetailList.addAll(carDetailList); adapter.notifyDataSetChanged(); for (CarDetail car : carDetailList) { // START LOADING IMAGES FOR EACH CAR car.loadImage(adapter); } carDetailList.clear(); Log.d("ewgf", String.valueOf(carDetailList.size())); } } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); new CarDetail().stopImageLoadTask(); } } 

público final boolean cancelar (boolean mayInterruptIfRunning)

Intenta cancelar la ejecución de esta tarea. Este bash fallará si la tarea ya se ha completado, ya se ha cancelado o no se puede cancelar por algún otro motivo . Si tiene éxito, y esta tarea no ha comenzado cuando se invoca cancelar, esta tarea nunca debería ejecutarse. Si la tarea ya ha comenzado, el parámetro mayInterruptIfRunning determina si el hilo que ejecuta esta tarea debe interrumpirse para intentar detener la tarea.

Use isCancelled ()

public boolean final isCancelled ()

Devuelve verdadero si esta tarea se canceló antes de que se completara normalmente. Si llama a cancel (boolean) en la tarea, el valor devuelto por este método debe verificarse periódicamente desde doInBackground (Object []) para finalizar la tarea lo antes posible .

Android – Cancele AsyncTask con fuerza

Compruebe la respuesta aceptada y la respuesta por commonsware en el enlace de arriba