簡體   English   中英

無法執行任務:下載項目時任務已執行錯誤

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

  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;
}

}

根據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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM