powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / Долгий запуск приложения после рестарта устройства
25 сообщений из 27, страница 1 из 2
Долгий запуск приложения после рестарта устройства
    #38800587
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, объясните пожалуйста дураку, почему при рестарте устройства приложение определенный участок кода выполняет около минуты ? Далее (работает таймер), даже после перезапуска приложения, блок отрабатывается нормально, около секунды.

Смысл такой: в директории около 14 тыс. jpg файлов (new File(COBA_PATH).listFiles()), мне нужно вытащить те, которые попадают под нужную маску, и сформировать listview.

Дело именно в этом куске, 146%, ибо если его закомментировать - задержка пропадает.

Сам участок кода:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
    ArrayList<HashMap<String, Object>> listObjects = new ArrayList<HashMap<String,Object>>();

            for (File cobaFile : new File(COBA_PATH).listFiles()) {


                // ========== Речь об этом блоке
                if (cobaFile.isFile() && fileExiting(listNumbers, cobaFile.getName()) != null) {
                    HashMap<String, Object> hm = new HashMap<String, Object>();

                    int start = cobaFile.getName().indexOf("-");
                    int finish = cobaFile.getName().lastIndexOf(".");

                    String fileNameIndex = cobaFile.getName().substring(start, finish);

                    hm.put("img", R.drawable.ic_logo);
                    hm.put("object", fileExiting(listNumbers, cobaFile.getName()) + fileNameIndex);
                    hm.put("fileName", cobaFile.getName());

                    listObjects.add(hm);
                }
                // ===========

            }



Заранее благодарю!
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38800643
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Кэш медисервера.
2. Такие операции нужно выполнять в любом случае только в доп.потоке, между делом оповещая основной (UI) поток через Handler.
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38800649
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может андроиду надо время для индексации 14 тыс файлов - а далее уже работает из кэша. Андроид и ОДИН файл размером 100Мб загружает около 5 сек и при этом приложение тоже "замирает" и дело вовсе не в отдельном потоке - а как я понял сама система тормозит и из-за этого тормозит само приложение.
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38800657
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про доп. поток понятно, это пока просто наброски.
В остальном - спасибо, успокоили! :)
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38800665
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола Питерскийа как я понял сама система тормозит и из-за этого тормозит само приложение
Не угадал.
korshunДело именно в этом куске, 146%, ибо если его закомментировать - задержка пропадает.
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38800800
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanМикола Питерскийа как я понял сама система тормозит и из-за этого тормозит само приложение
Не угадал.
korshunДело именно в этом куске, 146%, ибо если его закомментировать - задержка пропадает.

Я и не пытался угадать - просто уже попадал в такую ситуацию. Отдельный поток не помогает. Я это странное дело увидел при работе с TTS - размер поддержки и языковый модуль его более 100мб. Так вот в момент старта TTS основной поток подвисает т.е. приложение, вызвавшее TTS не реагирует ни на одно нажатие на моем устройстве секунд 5, попытка засунуть вызов TTS в отдельный поток ничего не изменило, потом нашел данные что TTS самостоятельно запускается в отдельном потоке. В общем потратил целую неделю на выявление "бага" но так ничего и не добился. Потом начал грузить все приложения из маркета с TTS и увидел что все они имеют такую же проблему - т.е. тормоза при первом запуске приложения после старта системы или же после остановки приложения диспетчером системы.
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801202
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ведь на самом деле при первом запуске ProgressDialog "висит" мёртво :)
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801231
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ан нет - доковырял свой код и не висит, крутится :)
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801250
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, висит все-таки :)
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801273
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshun,

а как реализовал?
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801498
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всю цепочку тогда покажу, вдруг какой-нибудь криминал увидите :)

1. В onCreate создаем таймер обратного отсчета и запускаем проверку директорий (ссылка на экземпляр класса таймера нужна для того, что бы можно было его остановить, когда активити уничтожается):

Код: 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.
    ................

    private MyCountDownTimer cdt;
    private SimpleAdapter adapter;

    ................

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        
        ................

        cdt = new MyCountDownTimer(11000, 1000, new ProgressDialog(this));
        new CheckDirectoryExist(new ProgressDialog(this)).execute();

        ...............
}

    @Override
    protected void onDestroy() {
        super.onDestroy();

        cdt.cancel();
    }



2. Класс проверки директорий. При успешном завершении запускается задача проверки смс'ок и формирования listview.

Код: 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.
    class CheckDirectoryExist
            extends AsyncTask<Void, Void, Boolean> {

        private ProgressDialog pd;

        CheckDirectoryExist(ProgressDialog pd) {
            this.pd = pd;

            this.pd.setTitle(Root.PD_TITLE);
            this.pd.setMessage("Files indexing ...");
        }

        @Override
        protected void onPreExecute() {
            this.pd.show();
        }

        @Override
        protected Boolean doInBackground(Void... params) {

            if (new File(COBA_PATH).isDirectory()) {
                if(!(new File(COBA_TEMP_PATH).isDirectory())) {
                    new File(COBA_TEMP_PATH).mkdirs();
                }
                listFiles = new File(COBA_PATH).listFiles();

                return true;
            }
            else {
                new File(COBA_PATH).mkdirs();
                new CheckDirectoryExist(this.pd).execute();
            }

            return false;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            this.pd.dismiss();

            if (result) {
                statusLabel.setText("Total passports: " + (listFiles.length - 1));
                new UpdateListView(this.pd).execute();
            }
            else {
                statusLabel.setText("Error");
            }

        }

    }



3. Класс проверки смс'ок и формирования listview. После завершения запускается таймер.

Код: 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.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
    class UpdateListView
            extends AsyncTask<Void, Void, Void> {

        private ProgressDialog pd;

        UpdateListView(ProgressDialog pd) {
            this.pd = pd;

            this.pd.setTitle(PD_TITLE);
            this.pd.setMessage("Scanning sms ...");
        }

        @Override
        protected void onPreExecute() {
            this.pd.show();
            listPassports.setAdapter(null);

            if (adapter != null) {
                adapter.notifyDataSetChanged();
            }
        }

        @Override
        protected Void doInBackground(Void... params) {
            getSms();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            this.pd.dismiss();

            listPassports.setAdapter(adapter);
            listPassports.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

            cdt.start();

        }

    }

    /*  Чтение смс сообщений */
    private void getSms() {

        Cursor cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null);
        ArrayList<String> listIncomingSms = new ArrayList<String>();

            if(cursor.moveToFirst()) {
                for (int idx = 0; idx < cursor.getCount(); idx++) {
                    String from = cursor.getString(cursor.getColumnIndexOrThrow("address"));
                    String body = cursor.getString(cursor.getColumnIndexOrThrow("body"));
                    Long timeDifference = (Calendar.getInstance().getTimeInMillis() - cursor.getLong(cursor.getColumnIndexOrThrow("date"))) / 1000;

                        if(from.equals(SMS_SENDER_NUMBER) && timeDifference <= SMS_LIFE_TIME && isInteger(getFirstWordInString(body))) {
                            listIncomingSms.add(getFirstWordInString(body));
                        }

                    cursor.moveToNext();
                }
            }

        cursor.close();

        itemsAdd(listIncomingSms);

    }


    /*  Добавление файлов в список  */
    private void itemsAdd(ArrayList<String> listIncomingSms) {

        ArrayList<HashMap<String, Object>> listPassports = new ArrayList<HashMap<String,Object>>();

            for (File cobaFile : listFiles) {

                if (cobaFile.isFile() && objectEquals(listIncomingSms, cobaFile.getName()) != null) {
                    HashMap<String, Object> listPassportItem = new HashMap<String, Object>();

                    int start = cobaFile.getName().indexOf("-");
                    int finish = cobaFile.getName().lastIndexOf(".");

                    String fileNameIndex = cobaFile.getName().substring(start, finish);

                    listPassportItem.put("img", R.drawable.ic_logo);
                    listPassportItem.put("object", objectEquals(listIncomingSms, cobaFile.getName()) + fileNameIndex);
                    listPassportItem.put("fileName", cobaFile.getName());

                    listPassports.add(listPassportItem);
                }
            }

        adapter = new SimpleAdapter(
                this,
                listPassports,
                R.layout.list_items,
                new String[]{
                        "img",
                        "object",
                        "fileName"
                },
                new int[]{
                        R.id.itemImg,
                        R.id.itemTitle,
                        R.id.itemHide
                });

    }



4. Таймер обратного отсчета, который запускает задачу из п. 3

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    class MyCountDownTimer
            extends CountDownTimer {

        private ProgressDialog pd;

        MyCountDownTimer(long millisInFuture, long countDownInterval, ProgressDialog pd) {
            super(millisInFuture, countDownInterval);
            this.pd = pd;
        }

        @Override
        public void onFinish() {
            reloadLabel.setText("Waiting for alarms ... 0");
            new UpdateListView(this.pd).execute();
        }

        @Override
        public void onTick(long millisUntilFinished) {
            reloadLabel.setText("Waiting for alarms ... " + (millisUntilFinished / 1000));
        }
    }
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801558
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я код писать не буду, просто подскажу направления:
1. Сканировать файлы стоит после того, как медиасканер с этим закончил. См. MEDIA_SCANNER_FINISHED
2. Почитай про нормальные потоки и их обработчики Handler. С ними можно общаться очередями сообщений и им можно менять (понижать) приоритет. У основного потока тоже есть Handler, которому можно сообщать о каждом просканированном файле или о каждом десятом, чтоб не перегружать очередь.
3. Что вообще этот код делает, вкратце?
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801636
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я обычно факт "торможения" проверяю переворотом устройства - переворот в это время не работает.
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801656
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman3. Что вообще этот код делает, вкратце?
Как уже писАл выше, есть "база" файлов, около 14ти тыс. штук.
При получении смс с определенного номера из его тела выдергивается первое слово-номер, ищется совпадение среди этой кучи файлов и формируется список (это все повторяется с периодичностью в 10 сек), при клике на пункт которого открывается соответствующая картинка.

За советы благодарю, почитаю.
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801701
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunПри получении смс
Йоперный бабай смс нужно получать через BroadcastReceiver на интент android.provider.Telephony.SMS_RECEIVED
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801718
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmankorshunПри получении смс
Йоперный бабай смс нужно получать через BroadcastReceiver на интент android.provider.Telephony.SMS_RECEIVED
Мне именно перехватывать его не нужно :) Мне достаточно просто знать, что с конкретного номера было такое-то сообщение.
Таймер тоже никуда не деть, так-как список формируется только по-факту пришедших смс за последние пол часа, более "старые" записи должны удаляться.
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801721
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А насчет медиасервера можно немного теории услышать ?:) Может плохо ищу, но информации что-то не особо много, что это и с чем его едят.
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801726
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunМне именно перехватывать его не нужно :) Мне достаточно просто знать, что с конкретного номера было такое-то сообщение.
То есть твое чудо будет сканировать ВСЕ смс каждые 10 секунд? Круто...

korshunА насчет медиасервера можно немного теории услышать ?:)
Это такой-же приемник, что и по приходу смс. Просто в гугл зайди с этим словом: MEDIA_SCANNER_FINISHED
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801735
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanТо есть твое чудо будет сканировать ВСЕ смс каждые 10 секунд?
Ага.
Что в этом криминального и как можно сделать по другому ?
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801740
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunЧто в этом криминального и как можно сделать по другому ?
1. Это ворует заряд батарейки и это некрасиво.
2. На 4.4.х и выше сам андроид будет кричать, что твое приложение пожирает ресурсы и настойчиво предлагать его убить. Я, кстати, всегда с его доводами соглашаюсь и батарейка держится заметно дольше, нежели позволять всем приложениям работать фоном.

Как по другому? 16826634
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801747
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо ты меня не понимаешь, либо я тебя, одно из двух :)
"Время жизни" смс - 30 минут.
Приходит смс, я ее перехватываю, обрабатываю, добавляю ссылку на нужный файл в список. Как теперь через полчаса эту запись удалить, на каждое событие таймер вешать или что ?
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801758
CoderGen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshun"Время жизни" смс - 30 минут.
Приходит смс, я ее перехватываю, обрабатываю, добавляю ссылку на нужный файл в список. Как теперь через полчаса эту запись удалить, на каждое событие таймер вешать или что ?
Что-то тут не так.
Пусть по Вашему. Если есть список - в чем проблема повешать дату и время постановки ссылки в список?
Так при том, что у Вас список, вы все равно скнируете все сообщения?
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801761
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunЛибо ты меня не понимаешь, либо я тебя, одно из двух :)
Скорее ты так пояснил ТЗ.

1. Со всей базой смс не принято работать фоном. Для этого перехватывают входящие смс и если нужно, сразу удаляют. Но удаление начиная с версии 4.4.х работать больше не будет.
2. Сканирование файлов лучше делать после того, как с ними закончил медиасканер. Затем просканировать нужную папки на предмет наличия всех файлов, внести в базу и повешать свой обработчик на изменения файловой системы (как и делает медиасканер) и при необходимости обновлять базу.
3. По приходу смс уже доставать из базы, дело секундное и для системы малозаметное.
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801782
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoderGenЕсли есть список - в чем проблема повешать дату и время постановки ссылки в список?
Так при том, что у Вас список, вы все равно скнируете все сообщения?
А что даст дата то сама по себе ? :)

wadmankorshunЛибо ты меня не понимаешь, либо я тебя, одно из двух :)
Скорее ты так пояснил ТЗ.

1. Со всей базой смс не принято работать фоном. Для этого перехватывают входящие смс и если нужно, сразу удаляют. Но удаление начиная с версии 4.4.х работать больше не будет.
2. Сканирование файлов лучше делать после того, как с ними закончил медиасканер. Затем просканировать нужную папки на предмет наличия всех файлов, внести в базу и повешать свой обработчик на изменения файловой системы (как и делает медиасканер) и при необходимости обновлять базу.
3. По приходу смс уже доставать из базы, дело секундное и для системы малозаметное.

1. Ок, понял, еще раз спасибо :) Удалять смс и не нужно.
2. Ок.
3. Понятно, но ты так не сказал ни да, ни нет на мой вопрос, как быть с удалением записи из списка через полчаса, на каждый приход смс свой таймер вешать ? :)
...
Рейтинг: 0 / 0
Долгий запуск приложения после рестарта устройства
    #38801819
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshun3. Понятно, но ты так не сказал ни да, ни нет на мой вопрос, как быть с удалением записи из списка через полчаса, на каждый приход смс свой таймер вешать ? :)
Зачем именно через полчаса?

П.С. Пусть приемник смс и удаляет принятые ранее смс. Будет не раз в полчаса, но это будет более системный подход.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Android [игнор отключен] [закрыт для гостей] / Долгий запуск приложения после рестарта устройства
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]