[英]Cannot execute task: the task has already been executed error in downloading items
the code which extends AssyncTask.扩展 AssyncTask 的代码。 is getting error正在出错
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once) at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:596) at android.os.AsyncTask.execute(AsyncTask.java:551) at com.monnfamily.libraryapp.Utility.DownloadManager.downloadBookData(DownloadManager.java:80) at
package com.monnfamily.libraryapp.Utility; import android.content.Context; import android.os.AsyncTask; import android.util.Log; public class DownloadManager extends AsyncTask<String, Void, Boolean> { private static final String TAG = "Download Manager"; public interface DownloadCompletedListner { // you can define any parameter as per your requirement public void downloadCompleted(); } private BookProperties mBookDetails; private DownloadCompletedListner mListner; private static final DownloadManager mInstance = new DownloadManager(); public static DownloadManager getInstance() { return mInstance; } private DownloadManager() { } @Override protected Boolean doInBackground(String... strings) { String tMainFolder = String.valueOf(BaseApplication.getInstance().getAppContext().getDir("MonnFamily", Context.MODE_PRIVATE)); tMainFolder += "/Book" + mBookDetails.getBookId(); downloadBookDetails(tMainFolder, ContentfulConstants.BOOK_MAIN_IMAGE + ".png", mBookDetails.getBookMainImage()); downloadBookDetails(tMainFolder, ContentfulConstants.BOOK_MAIN_AUDIO + ".mp3", mBookDetails.getBookSound()); for (PageDetailProperties pageDetails : mBookDetails.getPageDetail()) { String tPageNumber = pageDetails.getPageNumber().toString(); downloadBookDetails(tMainFolder, ContentfulConstants.PAGE_IMAGE + tPageNumber + ".png", pageDetails.getPageImage()); downloadBookDetails(tMainFolder, ContentfulConstants.PAGE_AUDIO + tPageNumber + ".mp3", pageDetails.getPageAudio()); downloadBookDetails(tMainFolder, ContentfulConstants.PAGE_TEXT + tPageNumber + ".txt", pageDetails.getPageText()); } return true; } protected void onPostExecute(Boolean result) { //This is run on the UI thread so you can do as you wish here if(result){ ((LibraryView)BaseApplication.getInstance().getCurrentActivity()).hideActivityView(); mListner.downloadCompleted(); } } public void downloadBookData(BookProperties pBook){ mBookDetails = pBook; String tMainFolder = String.valueOf(BaseApplication.getInstance().getAppContext().getDir("MonnFamily", Context.MODE_PRIVATE)); tMainFolder += "/Book" + pBook.getBookId(); File directory = new File(tMainFolder); if (!directory.exists()) { directory.mkdir(); ((LibraryView)BaseApplication.getInstance().getCurrentActivity()).showActivityView(); new DownloadManager().execute(); /// error ocuures here } } private void downloadBookDetails(String pMainFolder, String pFileName, String pDownloadURL){ try { URL url = new URL(pDownloadURL); URLConnection ucon = url.openConnection(); ucon.setReadTimeout(5000); ucon.setConnectTimeout(10000); InputStream is = ucon.getInputStream(); BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5); File directory = new File(pMainFolder, pFileName); FileOutputStream outStream = new FileOutputStream(directory); byte[] buff = new byte[5 * 1024]; int len; while ((len = inStream.read(buff)) != -1) { outStream.write(buff, 0, len); } outStream.flush(); outStream.close(); inStream.close(); } catch (Exception e) { //Add Network Error. Log.e(TAG, "Download Error Exception " + e.getMessage()); e.printStackTrace(); } } public void setListner(DownloadCompletedListner pListner) { this.mListner = pListner; } }
You need to separate your DownloadManager from AsyncTask, Create different class that will extend AsyncTask, for example, MyDownloaderAsyncTask, this class will execute the actual background work, and your DownloadManager will create each time new instance of MyDownloaderAsyncTask and execute it.您需要将 DownloadManager 与 AsyncTask 分开,创建不同的类来扩展 AsyncTask,例如 MyDownloaderAsyncTask,该类将执行实际的后台工作,并且您的 DownloadManager 每次都会创建 MyDownloaderAsyncTask 的新实例并执行它。 Your classes should look something like this:你的类应该是这样的:
public class MyDownloaderAsyncTask extends AsyncTask<String, Void, Boolean> {
private DownloadManager.DownloadCompletedListner mListner;
private BookProperties mBookDetails;
public MyDownloaderAsyncTask(DownloadManager.DownloadCompletedListner listener, BookProperties bookdetails) {
mListner=listener;
mBookDetails=bookdetails;
}
@Override
protected Boolean doInBackground(String... strings) {
String tMainFolder = String.valueOf(BaseApplication.getInstance().getAppContext().getDir("MonnFamily", Context.MODE_PRIVATE));
tMainFolder += "/Book" + mBookDetails.getBookId();
downloadBookDetails(tMainFolder, ContentfulConstants.BOOK_MAIN_IMAGE + ".png", mBookDetails.getBookMainImage());
downloadBookDetails(tMainFolder, ContentfulConstants.BOOK_MAIN_AUDIO + ".mp3", mBookDetails.getBookSound());
for (PageDetailProperties pageDetails : mBookDetails.getPageDetail()) {
String tPageNumber = pageDetails.getPageNumber().toString();
downloadBookDetails(tMainFolder, ContentfulConstants.PAGE_IMAGE + tPageNumber + ".png", pageDetails.getPageImage());
downloadBookDetails(tMainFolder, ContentfulConstants.PAGE_AUDIO + tPageNumber + ".mp3", pageDetails.getPageAudio());
downloadBookDetails(tMainFolder, ContentfulConstants.PAGE_TEXT + tPageNumber + ".txt", pageDetails.getPageText());
}
return true;
}
protected void onPostExecute(Boolean result) {
//This is run on the UI thread so you can do as you wish here
if(result){
((LibraryView)BaseApplication.getInstance().getCurrentActivity()).hideActivityView();
mListner.downloadCompleted();
}
}
private void downloadBookDetails(String pMainFolder, String pFileName, String pDownloadURL){
try
{
URL url = new URL(pDownloadURL);
URLConnection ucon = url.openConnection();
ucon.setReadTimeout(5000);
ucon.setConnectTimeout(10000);
InputStream is = ucon.getInputStream();
BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);
File directory = new File(pMainFolder, pFileName);
FileOutputStream outStream = new FileOutputStream(directory);
byte[] buff = new byte[5 * 1024];
int len;
while ((len = inStream.read(buff)) != -1)
{
outStream.write(buff, 0, len);
}
outStream.flush();
outStream.close();
inStream.close();
}
catch (Exception e)
{
//Add Network Error.
Log.e(TAG, "Download Error Exception " + e.getMessage());
e.printStackTrace();
}
}
} }
public class DownloadManager {
private static final String TAG = "Download Manager";
public interface DownloadCompletedListner {
// you can define any parameter as per your requirement
public void downloadCompleted();
}
private BookProperties mBookDetails;
private DownloadCompletedListner mListner;
private static final DownloadManager mInstance = new DownloadManager();
public static DownloadManager getInstance() {
return mInstance;
}
private DownloadManager() {
}
public void downloadBookData(BookProperties pBook){
mBookDetails = pBook;
String tMainFolder = String.valueOf(BaseApplication.getInstance().getAppContext().getDir("MonnFamily", Context.MODE_PRIVATE));
tMainFolder += "/Book" + pBook.getBookId();
File directory = new File(tMainFolder);
if (!directory.exists()) {
directory.mkdir();
((LibraryView)BaseApplication.getInstance().getCurrentActivity()).showActivityView();
new MyDownloaderAsyncTask(mListner, mBookDetails).execute(new String[]);
}
}
public void setListner(DownloadCompletedListner pListner) {
this.mListner = pListner;
}
} }
According to the threading rules section of AsyncTask :根据AsyncTask的线程规则部分:
The task can be executed only once (an exception will be thrown if a second execution is attempted.)任务只能执行一次(如果尝试第二次执行,将抛出异常。)
You can only execute an AsyncTask
once, so you should always create a new one whenever you want perform the task:您只能执行一次AsyncTask
,因此无论何时您想要执行任务,都应始终创建一个新任务:
new DownloadManager().execute(...);
Instead of:代替:
DownloadManager dm = new DownloadManager();
dm.execute(...);
dm.execute(...); // throws IllegalStateException
You may need to refactor your DownloadManager
class, or create a new sub-class of AsyncTask
.您可能需要重构DownloadManager
类,或创建AsyncTask
的新子类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.