Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
1

Обновление ProgressBar-a во время загрузки SQLite DB при включении приложения

14.08.2017, 04:40. Просмотров 349. Ответов 7
Метки нет (Все метки)

Добрый день.
Моя БД обновляется довольно долго поэтому хотелось бы показать пользователю прогресс обновления в SplashActivity.
Но никак не удается сообразить как это реализовать.
Немного знаком с AsyncTask, но методом проб и ошибок не получилось добиться желаемого.
Так как все таки это делается?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2017, 04:40
Ответы с готовыми решениями:

ProgressBar во время загрузки данных
Есть activity с navigationdrawer-ом, который переставляет фрагменты. В центре фрагмента крутится...

Выводить текст в Label во время загрузки ProgressBar
Всем привет! Подскажите, как мне сделать мою задумку по progressbar? Хочу чтобы во время загрузки...

Загрузка progressBar во время загрузки картинки в pictureBox из пути
Здравствуйте. :read: Можно сделать так, чтобы progressBar появлялся на экране и не зависал,...

Обновление ProgressBar во время длительной операции
Добрый вечер! У меня в цикле происходят длительные вычисления, поэтому я решил сделать вот что:...

Обновление значения элемента Progressbar во время выполнения программы
На форме есть: 1.кнопка, запускающая загрузку файлов из Интернета с использованием webClient 2....

7
kashichishi
1 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 57
14.08.2017, 06:58 2
Только в AsyncTask . В Методе doInBackground вызываете publishProgress ,при этом создаете новый метод в классе onProgressUpdate и обновляете данные в UI. Можно через потоки еще сделать ,используя хандлер ,но это трудновато.
0
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
14.08.2017, 07:17  [ТС] 3
kashichishi, Да, я так и делал, только не очень понял почему, но при вызове Splash Activity база данных не начинала обновляться, пока не создается объект DBHelper и не вызывается метод SQLiteDataBase getRedableDatabase()
Но пока база не обновится я не могу запустить MyTask для анимации прогрессбара, + особо нет идей по обновлению его. Можно конечно создать в DBHelpere переменную, которая в зависимости от работающего метода будет обновляться, в то время как в классе MyTask будет работать бесконечный цикл который будет запрашивать эту переменную и обновлять прогресс бар. Но кажется тут намудрено через чур, наверно есть, что - то проще. Если нет, то буду пробовать так реализовать. Вот тестовый класс, почему DB не обновляется автоматически при включении?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class SplashActivity extends AppCompatActivity {
 
    private final String LOG_TAG = "myLogs";
    private ProgressBar progressBar;
    Intent intent;
    DBHelper dbhelper;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_activity);
        Log.d(LOG_TAG,"SplashActivity открыли активити");
 
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        Log.d(LOG_TAG,"SplashActivity инициализировали прогресс бар");
 
        intent = new Intent(this,MainActivity.class);
 
        Log.d(LOG_TAG,"SplashActivity  запускаем майтаск");
        new MyTask().execute();
        Log.d(LOG_TAG, "SplashActivity запустили майтаск");
    }
 
    //Класс для Прогрессбара.
    private class MyTask extends AsyncTask<Void, Integer, Void> {
 
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            progressBar.setProgress(values[0]);
 
        }
 
        //Делаем прогрессбар видимым.
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.d(LOG_TAG, "SplashActivity делаем прогресс бар видимым.");
            progressBar.setVisibility(ProgressBar.VISIBLE);
        }
 
        //Ищем рифму.
        @Override
        protected Void doInBackground(Void... params) {
            Log.d(LOG_TAG, "SplashActivity бежим по циклу");
            for (int i = 0; i < 100; i++) {
                Log.d(LOG_TAG, "SplashActivity i = " + i);
                publishProgress(dbhelper.getI());
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
 
 
            return null;
        }
 
        //Скрываем прогрессбар и переходим на другое активити.
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            Log.d(LOG_TAG,"SplashActivity скрываем прогрессбар");
            progressBar.setVisibility(View.INVISIBLE);
            Log.d(LOG_TAG,"SplashActivity переходим на новую активити");
           /* startActivity(intent);
            finish();*/
        }
    }
}
Манифест Если нужен я хз..

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bargystvelp.myapplication">
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
Добавлено через 8 минут
только, что понял, что это так и работает, база обновляется при вызове метода, а не автоматически..
Но как в таком случае обновлять прогресс бар?
0
kashichishi
1 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 57
14.08.2017, 08:01 4
Попробуйте через переменную , как вы хотели. И вообще , я немного не понимаю зачем вам цикл. Один раз загрузили бд и все. А так это полный код вашего приложения?

Добавлено через 2 минуты
И если уж слишком большая бд , что аж грузит долго, советую ее поменять , например на mysql ибо ее загружать не нужно, только делать запросы на прямую или через пхп путем парсинга данных из json объекта
0
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
14.08.2017, 08:10  [ТС] 5
Нет, это тестовый, основной я не трогаю, пока не пойму как в тестовом сделать.
В принципе вывод напрашивается сам собой, нужно майтаск перетаскивать в DBHelper, но теперь не могу разобраться как в том классе работать с прогрессбаром, ловлю NullPointerException чуть ли не на каждой строчке. Не подскажете как правильно работать с элементами в другом классе?
Ну а как без цикла? или вы имеете в виду весь метод обновления базы запихать в doInBackground и в ключевых моментах обновлять прогрессбар?
0
kashichishi
1 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 57
14.08.2017, 08:17 6
Если ловите NullPointerException насколько я помню нужно засунуть проблемный код в try/catch
-1
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
14.08.2017, 19:07  [ТС] 7
Да не, я просто что - то не так делаю, кажется к вью элементам как - то по особенному доступ нужно получать, а не тупым методом getProgressBar =)

Добавлено через 10 часов 44 минуты
Ребят, кто делал подобное, отпишитесь как лучше сделать.
0
BargystVelp
2 / 2 / 2
Регистрация: 18.07.2017
Сообщений: 46
18.08.2017, 15:31  [ТС] 8
С progressBar-ом разобрался.
Создается пустая база через вызов метода getReadableDataBase(), а в метод MyTask перетаскивается содержимое метода onCreate() и в цикле через publishProgress() обновляется прогрессБар.
Контроль версий совершается методом записи в файл версии и проверкой на ее изменение.
0
18.08.2017, 15:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2017, 15:31

Плавное обновление progressbar при загрузке файла
Здравствуйте! Есть кнопка, отрабатывающая открытие текстового файла(строк 1-20млн.). Хотел сделать...

Обновление dll-файлов во время работы приложения
Доброго всем дня. Разработал сложный программный комплекс и теперь нужно разработать систему...

При включении компьютера и загрузки Windows 7 появляется бсод
небуду создавать новую тему так что опишу свою проблему тут, при включении компа и закрузки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru