У меня есть две 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]);
}
}
}
Как вы пришли к выводу, что это блокирует пользовательский интерфейс? Что вы ожидаете от экрана? – Blundell
Во время выполнения задач я хочу увидеть мой макет с индикатором выполнения. Но я вижу, что макет всего около 1 мс, чем черный экран, а затем называется деятельность. – sonderlain
Я не вижу никакой функции onPreExecute() в вашем классе DownloadFile, и я считаю, что ваш progressBar должен был быть вызван 'show()'. Вы инициализируете его перед вызовом downloadPack()? Если да, можете ли вы показать нам и эту часть кода? –