java - 无法执行任务 : the task has already been executed error in downloading items

标签 java android

  1. 我在我的代码中添加了 AssyncTask,但是一旦我从服务器下载数据,我就遇到了这个问题。任何人都可以给我建议。
  2. assyncTask 执行多次。它说任务已经执行。
  3. 请给出解决方案。
  4. 下面的代码我已经发布了完整的代码。
  5. 扩展 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;
}

关于java - 无法执行任务 : the task has already been executed error in downloading items,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53608895/

相关文章:

java - 多级登录用户和管理员?

Android:编译要在可绘制文件夹之外使用的 9 补丁文件?

android - 如何从底部动画 fragment

Java:多维数组中的连续区域,用于实现一个拉丁方

java - 如何使用 Java 中的 Morphia 和 Play 框架从实体中检索特定字段

java - 如何获得游戏的实时时间

java - ArithmeticException 除以零...如何修复此方法?

Unity中的Android本地通知

java - JUnit:应为 <java.lang.IndexOutOfBoundsException> 但为 <java.lang.NullPointerException>

android - 从 react-native-static-server : undefined is not an object (evaluating 'this.staticServer.start' ) 启动 StaticServer 时出错