From e5f3f14e70144dbaaa299b4e24c4ff9e4f20db83 Mon Sep 17 00:00:00 2001 From: Ilnar Sabirzyanov Date: Mon, 28 Dec 2015 17:08:27 +0300 Subject: [PATCH] Garbage fixed --- .idea/encodings.xml | 6 + .idea/gradle.xml | 19 ++ .idea/libraries/appcompat_v7_23_0_1.xml | 12 ++ .../libraries/support_annotations_23_0_1.xml | 11 ++ .idea/libraries/support_v4_23_0_1.xml | 13 ++ app/src/main/AndroidManifest.xml | 11 +- .../homework5/DownloadService.java | 33 ++++ .../homework5/InitSplashActivity.java | 166 ++++++------------ 8 files changed, 155 insertions(+), 116 deletions(-) create mode 100644 .idea/encodings.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/libraries/appcompat_v7_23_0_1.xml create mode 100644 .idea/libraries/support_annotations_23_0_1.xml create mode 100644 .idea/libraries/support_v4_23_0_1.xml create mode 100644 app/src/main/java/ru/ifmo/android_2015/homework5/DownloadService.java diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..75d544d --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/libraries/appcompat_v7_23_0_1.xml b/.idea/libraries/appcompat_v7_23_0_1.xml new file mode 100644 index 0000000..2a4b308 --- /dev/null +++ b/.idea/libraries/appcompat_v7_23_0_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/support_annotations_23_0_1.xml b/.idea/libraries/support_annotations_23_0_1.xml new file mode 100644 index 0000000..d20c6be --- /dev/null +++ b/.idea/libraries/support_annotations_23_0_1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/support_v4_23_0_1.xml b/.idea/libraries/support_v4_23_0_1.xml new file mode 100644 index 0000000..e262be7 --- /dev/null +++ b/.idea/libraries/support_v4_23_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 34fb554..1d3f6ef 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,8 @@ - - + + - + + + + diff --git a/app/src/main/java/ru/ifmo/android_2015/homework5/DownloadService.java b/app/src/main/java/ru/ifmo/android_2015/homework5/DownloadService.java new file mode 100644 index 0000000..c5ab1a0 --- /dev/null +++ b/app/src/main/java/ru/ifmo/android_2015/homework5/DownloadService.java @@ -0,0 +1,33 @@ +package ru.ifmo.android_2015.homework5; + +import android.app.IntentService; +import android.content.Intent; + +public class DownloadService extends IntentService { + + public DownloadService() { + super("DownloadService"); + } + + @Override + protected void onHandleIntent(Intent intent) { + try { + InitSplashActivity.downloadFile(this, new ProgressCallback() { + @Override + public void onProgressChanged(int progress) { + publishProgress(InitSplashActivity.DownloadState.DOWNLOADING, progress); + } + }); + publishProgress(InitSplashActivity.DownloadState.DONE, 100); + } catch (Exception e) { + publishProgress(InitSplashActivity.DownloadState.ERROR, 100); + } + } + + private void publishProgress(InitSplashActivity.DownloadState state, int progress) { + Intent intent = new Intent(InitSplashActivity.FILTER); + intent.putExtra(InitSplashActivity.STATE, state); + intent.putExtra(InitSplashActivity.PROGRESS, progress); + sendBroadcast(intent); + } +} diff --git a/app/src/main/java/ru/ifmo/android_2015/homework5/InitSplashActivity.java b/app/src/main/java/ru/ifmo/android_2015/homework5/InitSplashActivity.java index 8810d30..3189e0b 100644 --- a/app/src/main/java/ru/ifmo/android_2015/homework5/InitSplashActivity.java +++ b/app/src/main/java/ru/ifmo/android_2015/homework5/InitSplashActivity.java @@ -1,7 +1,10 @@ package ru.ifmo.android_2015.homework5; import android.app.Activity; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; @@ -22,13 +25,16 @@ public class InitSplashActivity extends Activity { // GZIP-архив, содержащий список городов в формате JSON. private static final String CITIES_GZ_URL = "https://www.dropbox.com/s/d99ky6aac6upc73/city_array.json.gz?dl=1"; + public static final String STATE = "state"; + public static final String PROGRESS = "progress"; + public static final String FILTER = "filter"; // Индикатор прогресса private ProgressBar progressBarView; // Заголовок private TextView titleTextView; - // Выполняющийся таск загрузки файла - private DownloadFileTask downloadTask; + private DownloadState downloadState; + private BroadcastReceiver broadcastReceiver; @Override @SuppressWarnings("deprecation") @@ -41,28 +47,32 @@ protected void onCreate(Bundle savedInstanceState) { progressBarView = (ProgressBar) findViewById(R.id.progress_bar); progressBarView.setMax(100); - - if (savedInstanceState != null) { - // Пытаемся получить ранее запущенный таск - downloadTask = (DownloadFileTask) getLastNonConfigurationInstance(); + if (savedInstanceState == null) { + downloadState = DownloadState.DOWNLOADING; + Intent intent = new Intent(this, DownloadService.class); + startService(intent); } - if (downloadTask == null) { - // Создаем новый таск, только если не было ранее запущенного таска - downloadTask = new DownloadFileTask(this); - downloadTask.execute(); - } else { - // Передаем в ранее запущенный таск текущий объект Activity - downloadTask.attachActivity(this); + if (downloadState != DownloadState.DONE) { + broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + switch ((DownloadState)intent.getSerializableExtra(STATE)) { + case DONE: + case ERROR: + unregisterReceiver(this); + break; + default: + updateView((DownloadState)intent.getSerializableExtra(STATE), intent.getIntExtra(PROGRESS, 0)); + } + } + }; + registerReceiver(broadcastReceiver, new IntentFilter(FILTER)); } } - @Override - @SuppressWarnings("deprecation") - public Object onRetainNonConfigurationInstance() { - // Этот метод вызывается при смене конфигурации, когда текущий объект - // Activity уничтожается. Объект, который мы вернем, не будет уничтожен, - // и его можно будет использовать в новом объекте Activity - return downloadTask; + private void updateView(DownloadState state, int progress) { + titleTextView.setText(state.titleResId); + progressBarView.setProgress(progress); } /** @@ -81,103 +91,33 @@ enum DownloadState { } } - /** - * Таск, выполняющий скачивание файла в фоновом потоке. - */ - static class DownloadFileTask extends AsyncTask - implements ProgressCallback { - - // Context приложения (Не Activity!) для доступа к файлам - private Context appContext; - // Текущий объект Activity, храним для обновления отображения - private InitSplashActivity activity; - - // Текущее состояние загрузки - private DownloadState state = DownloadState.DOWNLOADING; - // Прогресс загрузки от 0 до 100 - private int progress; - - DownloadFileTask(InitSplashActivity activity) { - this.appContext = activity.getApplicationContext(); - this.activity = activity; - } - - /** - * Этот метод вызывается, когда новый объект Activity подключается к - * данному таску после смены конфигурации. - * - * @param activity новый объект Activity - */ - void attachActivity(InitSplashActivity activity) { - this.activity = activity; - updateView(); - } - - /** - * Вызываем на UI потоке для обновления отображения прогресса и - * состояния в текущей активности. - */ - void updateView() { - if (activity != null) { - activity.titleTextView.setText(state.titleResId); - activity.progressBarView.setProgress(progress); - } - } - - /** - * Вызывается в UI потоке из execute() до начала выполнения таска. - */ - @Override - protected void onPreExecute() { - updateView(); - } - - /** - * Скачивание файла в фоновом потоке. Возвращает результат: - * 0 -- если файл успешно скачался - * 1 -- если произошла ошибка - */ - @Override - protected DownloadState doInBackground(Void... ignore) { - try { - downloadFile(appContext, this /*progressCallback*/); - state = DownloadState.DONE; - - } catch (Exception e) { - Log.e(TAG, "Error downloading file: " + e, e); - state = DownloadState.ERROR; - } - return state; - } - - // Метод ProgressCallback, вызывается в фоновом потоке из downloadFile - @Override - public void onProgressChanged(int progress) { - publishProgress(progress); - } + @Override + public void onSaveInstanceState(Bundle outBundle) { + outBundle.putInt(PROGRESS, progressBarView.getProgress()); + outBundle.putSerializable(STATE, downloadState); + super.onSaveInstanceState(outBundle); + } - // Метод AsyncTask, вызывается в UI потоке в результате вызова publishProgress - @Override - protected void onProgressUpdate(Integer... values) { - if (values.length > 0) { - int progress = values[values.length - 1]; - this.progress = progress; - updateView(); - } - } + @Override + public void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + downloadState = (DownloadState)savedInstanceState.getSerializable(STATE); + updateView(downloadState, savedInstanceState.getInt(PROGRESS)); + } - @Override - protected void onPostExecute(DownloadState state) { - // Проверяем код, который вернул doInBackground и показываем текст в зависимости - // от результата - this.state = state; - if (state == DownloadState.DONE) { - progress = 100; - } - updateView(); - } + @Override + public void onDestroy() { + super.onDestroy(); + try { + unregisterReceiver(broadcastReceiver); + } catch (Exception e) {} } + @Override + @SuppressWarnings("deprecation") + public Object onRetainNonConfigurationInstance() { + return broadcastReceiver; + } /** * Скачивает список городов во временный файл. */