简体   繁体   English

无法执行任务:下载项目时任务已执行错误

[英]Cannot execute task: the task has already been executed error in downloading items

  1. I have added AssyncTask in my code but once i download data from server i got this issue.. any one give me suggestion.我在我的代码中添加了 AssyncTask 但是一旦我从服务器下载数据我就遇到了这个问题..任何人给我建议。
  2. The assyncTask perform multiple times. assyncTask 执行多次。 and it says the task has already been executed.它说任务已经执行。
  3. please give any solutions for this.请为此提供任何解决方案。
  4. below code i have posted entire code.下面的代码我已经发布了整个代码。
  5. 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.

相关问题 AsyncTask android异常(无法执行任务:该任务已经执行) - AsyncTask android exception (Cannot execute task: the task has already been executed) ScheduledExecutorService - 检查计划任务是否已完成 - ScheduledExecutorService - Check if scheduled task has already been completed ImageReader maxImages(2)已在后台任务中获取 - ImageReader maxImages (2) has already been acquired in background task 错误:无法将任务“clean”添加为具有该名称的任务已存在 - ERROR: Cannot add task 'clean' as a task with that name already exists Sonarqube gradle 错误:无法将任务“downloadNode”添加为已具有该名称的任务 - Sonarqube gradle error: Cannot add task 'downloadNode' as a task with that name already 不能执行 <sequential> 蚂蚁任务 - Cannot execute <sequential> task with Ant 无法添加任务&#39;:jacocoTestReport&#39;作为具有该名称的任务已存在 - Cannot add task ':jacocoTestReport' as a task with that name already exists 无法添加任务“干净”,因为该名称已经存在 - Cannot add task 'clean' as a task with that name already exists 无法将任务“X”添加为具有该名称的任务已存在 - Cannot add task 'X' as a task with that name already exists 在jsp中下载图像:Illegalstateexception:此响应已调用getwriter() - Downloading images in a jsp: Illegalstateexception: getwriter() has already been called for this response
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM