2013-05-14 161 views
1

我已經在類中創建了一個AsyncTask,並且我正在從一個片段中調用該任務。問題是我想停止doInBackground方法,如果片段被破壞。爲此,我在AsyncTask編寫的類中創建了一個方法,並在該方法的Asynctask對象上使用了cancel(true)。當我從片段onDestroy()調用此方法時,後臺進程仍在運行。 Plz告訴我停止asynctask的doInBackground的正確方法。停止AsyncTask doInBackground方法

在這裏的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<String, String, Bitmap> { 

     @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<CarDetail> CREATOR = new Parcelable.Creator<CarDetail>() { 
     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"); 
} 

這是片段的類

public class ServiceCarListFragment extends Fragment { 

private String url; 
private ArrayList<CarDetail> carDetailList = new ArrayList<CarDetail>(); 
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<CarDetail>>{ 



    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     progressDialog = ProgressDialog.show(getActivity(), null, "Loading...",true); 

    } 

    @Override 
    protected ArrayList<CarDetail> doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     ArrayList<CarDetail> carDetailList = JsonParser.parseJson(params[0]); 
     return carDetailList; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<CarDetail> 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(); 
} 

} 

回答

4

公共最後布爾取消(布爾mayInterruptIfRunning)

試圖取消對此任務的執行。 如果任務已完成,已被取消或由於某些其他原因無法取消,此嘗試將失敗。如果成功,並且此任務在調用取消時尚未開始,則此任務不應運行。如果任務已經開始,則mayInterruptIfRunning參數確定執行此任務的線程是否應該中斷以試圖停止任務。

使用isCancelled()

公共最後布爾isCancelled()

返回true之前正常完成這個任務被取消。 如果對任務調用cancel(boolean),則應該從doInBackground(Object [])中定期檢查此方法返回的值,以儘快結束任務

Android - Cancel AsyncTask Forcefully

檢查接受的答案,並通過commonsware在上面的鏈接的答案

+0

如果我執行的AsyncTask 10次,我取消它像我在上面所做的將意味着它的一個將被取消,休息9次運行 – Ravi 2013-05-14 09:03:39

+0

引用文檔「從DONUT開始,這被改爲一個允許多個任務並行運行的線程池。從HONEYCOMB開始,任務在單個線程上執行,以避免常見的應用程序錯誤並行執行「。所以我不認爲10個異步任務會並行運行。檢查鏈接http://developer.android.com/reference/android/os/AsyncTask.html – Raghunandan 2013-05-14 09:05:46

+0

該任務只能執行一次(如果嘗試執行第二次執行,則會引發異常。)檢查線程規則下的主題在上面的評論 – Raghunandan 2013-05-14 09:13:38

相關問題