[英]AsyncTask android exception (Cannot execute task: the task has already been executed)
[英]Cannot execute task: the task has already been executed error in downloading items
擴展 AssyncTask 的代碼。 正在出錯
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; } }
您需要將 DownloadManager 與 AsyncTask 分開,創建不同的類來擴展 AsyncTask,例如 MyDownloaderAsyncTask,該類將執行實際的后台工作,並且您的 DownloadManager 每次都會創建 MyDownloaderAsyncTask 的新實例並執行它。 你的類應該是這樣的:
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;
}
}
根據AsyncTask的線程規則部分:
任務只能執行一次(如果嘗試第二次執行,將拋出異常。)
您只能執行一次AsyncTask
,因此無論何時您想要執行任務,都應始終創建一個新任務:
new DownloadManager().execute(...);
代替:
DownloadManager dm = new DownloadManager();
dm.execute(...);
dm.execute(...); // throws IllegalStateException
您可能需要重構DownloadManager
類,或創建AsyncTask
的新子類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.