0

У меня есть две AsyncTasks, одна используется для загрузки xml-файла (DownloadTask), другая для разбора файла (ParseXMLTask). Есть два случая использования этой задачи:Путаница с фоновыми потоками

1) Файл не существует> Execute DownloadTask, onPostExecute> ParseXMLTask

2) Файл существует> Execute только ParseXMLTask.

Все работает, но дело в том, что при выполнении во втором случае есть блокировка ui около 3 секунд (черный экран), что наверняка сделало бы пользователя раздраженным. Это меня совершенно сбивает с толку, потому что работа во втором случае кажется более простой.

Итак, когда я тестирую свое приложение, ситуация такова: я нажимаю на кнопку в первый раз, файл загружается, сохраняется на SD-карте, разбирается и, наконец, открывается. Затем я возвращаюсь и снова нажимаю кнопку. Теперь я вижу это отставание при переключении между действиями.

Код:

Выполнение задачи

private void downloadPack() { 
    if (packDownloaded) { 
     parseXML(); 
    } else {  
     download = new DownloadFile(fileName, this, loadingBar); 
     download.execute(serverURL + fileName + ".xml"); 
    } 
} 

private void parseXML() { 
    ParseXMLTask parseTask = new ParseXMLTask(this, this); 
    parseTask.execute(PATH + fileName + ".xml"); 
} 

public void postDownload(File result) { 
     parseXML();  
} 

public void postParse() {    
    Intent packIntent = new Intent(this, PackActivity.class); 
    startActivity(packIntent);  
} 

ParseXMLTask.java

public class ParseXMLTask extends AsyncTask<String, Integer, Void> {  

private Context context; 
private XmlPullParser xpp; 
private IPostParse iPostParse; 

public ParseXMLTask(Context context, IPostParse iPostParse) { 
    this.context = context; 
    this.iPostParse = iPostParse; 

} 

@Override 
protected Void doInBackground(String... params) {    
    File file = new File(params[0]); 

    /* doing the job */ 
} 

@Override 
protected void onPostExecute(Intent result) { 
    iPostParse.postParse(result); 
} 
} 

DownloadFile.java

public class DownloadFile extends AsyncTask<String, Integer, File> { 

private static final String PATH = Environment 
     .getExternalStorageDirectory().getPath() + "/.chgkgame/";; 
private File dir; 
private ProgressBar progressBar; 
private String fileName; 
private IPostDownload postDownload; 
private boolean download; 


public DownloadFile(String name, IPostDownload pDownload, ProgressBar pBar) { 
    progressBar = pBar; 
    fileName = name; 
    postDownload = pDownload; 
} 


@Override 
protected File doInBackground(String... sUrl) { 
    URL url; 
    try { 
     url = new URL(sUrl[0]); 
     URLConnection urlConnection = url.openConnection(); 
     urlConnection.connect();    
     int fileLength = urlConnection.getContentLength(); 

     dir = new File(PATH + fileName + ".xml"); 
     InputStream input = new BufferedInputStream(url.openStream()); 
     OutputStream output = new FileOutputStream(dir); 

     byte[] data = new byte[1024]; 
     long total = 0; 
     int count; 
     while ((count = input.read(data)) != -1) { 
      total += count; 
      publishProgress((int) (total * 100/fileLength)); 
      output.write(data, 0, count); 
     } 

     output.flush(); 
     output.close(); 
     input.close(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return dir; 
} 

@Override 
protected void onPostExecute(File result) { 
    if (postDownload != null) postDownload.postDownload(result); 
} 

@Override 
protected void onProgressUpdate(Integer... values) { 
    super.onProgressUpdate(values); 

    if (progressBar != null) { 
     progressBar.setProgress(values[0]); 
    } 
} 
} 
+0

Как вы пришли к выводу, что это блокирует пользовательский интерфейс? Что вы ожидаете от экрана? – Blundell

+0

Во время выполнения задач я хочу увидеть мой макет с индикатором выполнения. Но я вижу, что макет всего около 1 мс, чем черный экран, а затем называется деятельность. – sonderlain

+0

Я не вижу никакой функции onPreExecute() в вашем классе DownloadFile, и я считаю, что ваш progressBar должен был быть вызван 'show()'. Вы инициализируете его перед вызовом downloadPack()? Если да, можете ли вы показать нам и эту часть кода? –

ответ

0

Нет ничего плохого в вышеуказанном.

Разбор довольно быстрый, поэтому вы видите только макет для секунды.

Черный экран будет PackActivity loading, Проверьте эту активность за то, что блокирует нить пользовательского интерфейса.

Возможно, вы также разместили сообщения LogCat, чтобы показать, что синтаксический анализ завершен, и вызывается onCreate следующего действия.

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