package com.dotcool.reader.task; import java.util.ArrayList; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import com.dotcool.R; import com.dotcool.reader.callback.CallbackEventData; import com.dotcool.reader.callback.ICallbackEventData; import com.dotcool.reader.callback.ICallbackNotifier; import com.dotcool.reader.dao.NovelsDao; import com.dotcool.reader.helper.AsyncTaskResult; import com.dotcool.reader.model.NovelCollectionModel; import com.dotcool.reader.model.PageModel; public class DownloadNovelDetailsTask extends AsyncTask<PageModel, ICallbackEventData, AsyncTaskResult<NovelCollectionModel[]>> implements ICallbackNotifier { public volatile IAsyncTaskOwner owner; private int currentPart = 0; private int totalParts = 0; private final String taskId; public DownloadNovelDetailsTask(IAsyncTaskOwner owner) { this.owner = owner; this.taskId = this.toString(); } @Override protected void onPreExecute() { // executed on UI thread. // owner.toggleProgressBar(true); boolean exists = false; exists = owner.downloadListSetup(this.taskId, null, 0, false); if (exists) this.cancel(true); } public void onCallback(ICallbackEventData message) { publishProgress(message); } @Override protected AsyncTaskResult<NovelCollectionModel[]> doInBackground(PageModel... params) { Context ctx = owner.getContext(); ArrayList<NovelCollectionModel> result = new ArrayList<NovelCollectionModel>(); totalParts = params.length; for (PageModel pageModel : params) { currentPart++; try { publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.download_novel_details_task_progress, pageModel.getTitle()))); NovelCollectionModel novelCol = NovelsDao.getInstance().getNovelDetailsFromInternet(pageModel, this); Log.d("DownloadNovelDetailsTask", "Downloaded: " + novelCol.getPage()); result.add(novelCol); } catch (Exception e) { Log.e("DownloadNovelDetailsTask", "Failed to download novel details for " + pageModel.getPage() + ": " + e.getMessage(), e); publishProgress(new CallbackEventData(ctx.getResources().getString(R.string.download_novel_details_task_error, pageModel.getPage(), e.getMessage()))); return new AsyncTaskResult<NovelCollectionModel[]>(e); } } return new AsyncTaskResult<NovelCollectionModel[]>(result.toArray(new NovelCollectionModel[result.size()])); } @Override protected void onProgressUpdate(ICallbackEventData... values) { // executed on UI thread. owner.setMessageDialog(values[0]); owner.updateProgress(this.taskId, currentPart, totalParts, values[0].getMessage()); } @Override protected void onPostExecute(AsyncTaskResult<NovelCollectionModel[]> result) { owner.setMessageDialog(new CallbackEventData(owner.getContext().getResources().getString(R.string.download_novel_details_task_complete))); owner.onGetResult(result, NovelCollectionModel[].class); owner.downloadListSetup(this.taskId, null, 2, result.getError() != null ? true : false); } }