2013-04-18 2 views
2

у меня есть метод, как это:onPostExecute вызывается перед doInBackground завершается - Асинхронный задача

public void extractFiles() { 

    AsyncTask<Void, Void, Boolean> extractionTask = new AsyncTask<Void, Void, Boolean>() { 

     @Override 
     protected void onPreExecute() { 
     progressDialog = new ProgressDialog(Activity.this); 
     progressDialog.setCancelable(false); 
     progressDialog.setMessage("Extracting Files Please wait..."); 
     progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progressDialog.setProgress(0); 
     progressDialog.show(); 
     super.onPreExecute(); 
     } 

     @Override 
     protected Boolean doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     String xapkFilePath = XAPKFilePath(Activity.this); 
     String exportDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" 
      + Activity.this.getPackageName() + "/files/"; 
     File exportDirectoryFilepath = new File(exportDirectory); 
     exportDirectoryFilepath.mkdirs(); 
     ZipHelper zhelper = new ZipHelper(); 


     System.out.println("In background called"); 
     zhelper.unzip(xapkFilePath, exportDirectoryFilepath); 

     return true; 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 
     if (progressDialog != null && progressDialog.isShowing()) { 
      progressDialog.dismiss(); 
      System.out.println("progress dialog dismissed"); 
     } 
     if (result) { 
      //start intent. 
     } 
     } 

    }; 
    extractionTask.execute(); 
    } 

public class ZipHelper { 

    boolean zipError = false; 

    public boolean isZipError() { 
    return zipError; 
    } 

    public void setZipError(boolean zipError) { 
    this.zipError = zipError; 
    } 

    public void unzip(String archive, File outputDir) { 
    try { 
     Log.d("control", "ZipHelper.unzip() - File: " + archive); 
     ZipFile zipfile = new ZipFile(archive); 
     for (Enumeration e = zipfile.entries(); e.hasMoreElements();) { 
     ZipEntry entry = (ZipEntry) e.nextElement(); 

     System.out.println("OUTPUT DIR 1*" + outputDir); 
     System.out.println("ENTRY IS " + entry); 

     unzipEntry(zipfile, entry, outputDir); 

     } 
    } catch (Exception e) { 
     Log.d("control", "ZipHelper.unzip() - Error extracting file " + archive + ": " + e); 
     setZipError(true); 
    } 
    } 

    private void unzipEntry(ZipFile zipfile, ZipEntry entry, File outputDir) throws IOException { 
    if (entry.isDirectory()) { 
     createDirectory(new File(outputDir, entry.getName())); 
     return; 
    } 

    File outputFile = new File(outputDir, entry.getName()); 
    if (!outputFile.getParentFile().exists()) { 
     createDirectory(outputFile.getParentFile()); 
     System.out.println("OUTPUT FILE IS " + outputFile.getParentFile()); 
    } 

    Log.d("control", "ZipHelper.unzipEntry() - Extracting: " + entry); 
    BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry)); 
    BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile)); 
    try { 
     IOUtils.copy(inputStream, outputStream); 
    } catch (Exception e) { 
     Log.d("control", "ZipHelper.unzipEntry() - Error: " + e); 
     setZipError(true); 
    } finally { 
     outputStream.close(); 
     inputStream.close(); 
    } 
    } 

    private void createDirectory(File dir) { 
    Log.d("control", "ZipHelper.createDir() - Creating directory: " + dir.getName()); 
    if (!dir.exists()) { 
     if (!dir.mkdirs()) { 
     throw new RuntimeException("Can't create directory " + dir); 
     } 
    } else { 
     Log.d("control", "ZipHelper.createDir() - Exists directory: " + dir.getName()); 
    } 
    } 

} 

Здесь я называю метод, как этот extractFiles(), но то, что происходит еще до того, как doInBackground завершается, что извлечение файлов, для которых я показываю spinner, onPostExecute вызывается и переходит к следующему экрану.

Что здесь не так?

ответ

1
public void extractFiles() { 
    new TheTask().execute(params); 
} 
class TheTask extends AsyncTask<Void,Void,Void> 
{ 
    ....... 
} 

Вы должны назвать супер первый в

@Override 
    protected void onPreExecute() 
     super.onPreExecute(); 
    } 

AsyncTask должен быть загружен на UI Thread. Asynctask onPreExecute() инициализируется в потоке ui при загрузке asynctask. После чего doInBAckground() запускается в фоновом потоке. Результатом doInBackground() является параметр onPostExecute().

Когда асинхронная задача выполняется, задача проходит через 4 этапа:

  1. onPreExecute(), вызывается в потоке пользовательского интерфейса, прежде чем задача выполняется. Этот шаг обычно используется для настройки задачи, например, показывая индикатор выполнения в пользовательском интерфейсе.

  2. doInBackground (Params ...), вызываемый в фоновом потоке сразу после onPreExecute() заканчивает выполнение. Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. Параметры асинхронной задачи передаются на этот шаг. Результат вычисления должен быть возвращен этим шагом и будет возвращен на последний шаг. Этот шаг также может использовать publishProgress (Progress ...) для публикации одного или нескольких единиц прогресса. Эти значения публикуются в потоке пользовательского интерфейса на этапе onProgressUpdate (Progress ...).

  3. onProgressUpdate (Progress ...), вызываемый в потоке пользовательского интерфейса после вызова publishProgress (Progress ...). Время выполнения не определено. Этот метод используется для отображения любой формы прогресса в пользовательском интерфейсе, пока фоновое вычисление все еще выполняется. Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.

  4. onPostExecute (Result), вызывается в потоке пользовательского интерфейса после завершения вычисления фона. Результат вычисления фона передается на этот шаг в качестве параметра.

http://developer.android.com/reference/android/os/AsyncTask.html

+0

спасибо, но где я собираюсь здесь не так? не могли бы вы рассказать мне – Goofy

+0

см. выше, вам нужно позвонить супер сначала в onPreExecute(). также вызывается asynctask, как указано выше в файле extractFiles() – Raghunandan

+0

ok проверит это и вернется сюда – Goofy

1

проверить состояние в doinbackground полностью выполнить операцию или нет, если выполняют затем возвращает истину,

zhelper.unzip(xapkFilePath, exportDirectoryFilepath); 
+0

ok, я didnt получаю, можете ли вы, пожалуйста, уточнить – Goofy

+0

Я хочу сказать, что doinbackground возвращает true, поэтому postexecute вызывает, вместо этого возвращает true, когда завершается операция извлечения. –

+0

да, я получил вашу мысль, но я не понимаю, как это сделать? не могли бы вы мне помочь? – Goofy

Смежные вопросы