Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
#1

TextView тормозит копирование файла - Программирование Android

12.09.2013, 01:08. Просмотров 666. Ответов 10
Метки нет (Все метки)

Копирую файл при помощи буферных потоков ввода вывода, прогресс вывожу в диалоге.

Код
Java
1
2
fileProgress.setProgress((int) (publish / onePercent));
tvFileProgress.setText((int) (publish / onePercent)+" %");
первая строка прогресс бар, вторая прогресс в процентах. Если вторую строку закоментить то копирование завершается быстрее=)Это как так)?Расчет там вроде не самый ресурсоемкий. Как поправить?

З.Ы. Вообще с помощью потоков как то медленно копируется...подскажите другие решения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2013, 01:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос TextView тормозит копирование файла (Программирование Android):

Текст из TextView перенести в другой TextView по нажатию Button - Программирование Android
Люди, помогите плиз. Недавно начал ковырять программирование под Android. Хотел сделать банальную вещь - текст из TextView перенести в...

Отображение текста (из файла) в textView - Программирование Android
В общем не могу разобраться как сделать так что бы при нажатии на кнопку (Button) в компоненте textView отображался текст, который будет...

Вставка текста из файла в TextView - Программирование Android
Доброй ночи. Вопрос возможно банален, но сейчас 2 ночи,а ответ так и не удалось найти. Собственно вопрос: Необходимо загрузить...

Отображать в textView текст из файла txt - Программирование Android
нужно отображать в textView текст из файла txt. может кто-то рассказать принцип или дать ссылку для ознакомления?

TextView txt = new TextView(this); - ошибка - Программирование Android
Возникла проблема с динамическим создание TextView в цыкле, хотя в другом месте создается таким же образом все нормально TextView txt =...

Копирование файла с Android на PC, или синхронизация SQLite - Программирование Android
Здравствуйте!!! У меня на телефоне есть база данных (путь до базы /data/data/имя приложения/databases/baza.db). Когда тестировал на...

10
vxg
Модератор
3188 / 1991 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
12.09.2013, 07:25 #2
к настоящей причине замедления наверное не относится, но ускорить отображение можно если обновлять элемент экрана только каждый целый процент
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
12.09.2013, 11:42  [ТС] #3
Цитата Сообщение от vxg Посмотреть сообщение
к настоящей причине замедления наверное не относится, но ускорить отображение можно если обновлять элемент экрана только каждый целый процент
Так он и так обновляется только тогда когда есть целое число
0
verylazy
Заблокирован
12.09.2013, 11:48 #4
это все крутится в отдельном потоке, в doInBackground и onProgressUpdate ?
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
12.09.2013, 12:59  [ТС] #5
Цитата Сообщение от verylazy Посмотреть сообщение
это все крутится в отдельном потоке, в doInBackground и onProgressUpdate ?
да

Кликните здесь для просмотра всего текста
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
@Override
        protected Void doInBackground(Void... params) {
            switch (operationCode) {
            case FileManagerMain.COPY_FILE:
                byte data[] = new byte[1024];
                int step = 0;
                try {
                    FileInputStream fileInputStream = new FileInputStream(file);
                    BufferedInputStream bufferedInputStream = new BufferedInputStream(
                            fileInputStream);
                    FileOutputStream fileOutputStream = new FileOutputStream(
                            new File("/sdcard/test/1"));
                    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
                            fileOutputStream);
                    while ((step = bufferedInputStream.read(data, 0, 1024)) != -1) {
                        bufferedOutputStream.write(data, 0, step);
                        publish += step;
                        publishProgress((int) publish);
                    }
                    Log.d(LOG_TAG, "" + publish + " params[0]" + file.length());
                    bufferedOutputStream.flush();
                    bufferedInputStream.close();
                    bufferedOutputStream.close();
                } catch (FileNotFoundException e) {
                    Log.d(LOG_TAG, "FileNotFoundException");
                    e.printStackTrace();
                } catch (IOException e) {
                    Log.d(LOG_TAG, "IOException");
                    e.printStackTrace();
                }}
Java
1
2
3
4
protected void onProgressUpdate(Integer... progress) {
            if (copyDialog.fileIncrement(file, progress[0]))// в этом методе изменяется состояние view элементов диалогового окна
                publish = 0;
        }


copyDialog - класс для кастомного экрана загрузки (наследник Dialog)
0
vxg
Модератор
3188 / 1991 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
12.09.2013, 14:05 #6
интересно, только я тут не вижу обновление счетчика каждый ЦЕЛЫЙ процент?
Java
1
2
                       publish += step;
                       publishProgress((int) publish);
может как то так
Java
1
2
                       publish += step;
                       if (текущий полученный процент отличается от предыдущего выведенного на единицу) publishProgress((int) publish);
Добавлено через 1 минуту
...в противном случае мы будем задалбывать экран обновлениями каждый килобайт файла и если файл имеет размер мегабайт мы обновимся 1000 раз. а процентов всего 100)
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
12.09.2013, 14:57  [ТС] #7
Это делалось в классе диалогового окна

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private long getOnePercent(long fileSize) {
        return (long) fileSize / 100;
    }
 
    public boolean fileIncrement(File file, int publish) {
        long onePercent = getOnePercent(file.length());
        if (publish >= onePercent) {
            fileProgress.setProgress((int) (publish / onePercent));
            tvFileProgress.setText((int) (publish / onePercent) + " %");
return true;
            }
        return false;
 
    }
т.е. обновляется он как надо, только метод publishProgtrss() вызывается во время каждой итерации. Возможно из-за этого копируется так долго(хотя я склоняюсь к тому что буфер в 1024 маловат), но не отвечает на вопрос почему при комментировании строки в которой отображается прогресс в процентах все работает быстрее. Ведь publishProgtrss() вызывается столько же раз.
0
vxg
Модератор
3188 / 1991 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
12.09.2013, 15:11 #8
ваш код обновляет во время каждого вызова начиная с размера полученных данных больше чем 1 процент размера файла. то есть по-честному он работает только первый процент

Добавлено через 20 секунд
...а все остальное время молотит каждый вызов
1
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
12.09.2013, 15:23  [ТС] #9
Да, Вы правы.Не углядел... Благодарю!
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
16.09.2013, 23:08  [ТС] #10
Не хочется создавать новую тему, т.к. она косвенно касается этого обсуждения.

Гуру Java архитектуры подскажите немного по организации проекта. Есть нить которая загружает файл и есть класс который отображает прогресс копирования. Где лучше, даже не лучше а правильно разместить методы которые будут собирать информацию о процессе копирования(количество файлов для копирования, их размер и т.д.). Я сначала их разместил в классе диалога, но потом решил, что при определенных условия могут быть "долгоиграющими" и перенес их в нить копирования. Направьте на путь истинный)
0
verylazy
Заблокирован
17.09.2013, 09:38 #11
я не гуру архитектуры, но читал вот это http://developer.android.com/training/articles/perf-anr.html
Potentially long running operations such as network or database operations, or computationally expensive calculations such as resizing bitmaps should be done in a worker thread (or in the case of databases operations, via an asynchronous request).

The most effecive way to create a worker thread for longer operations is with the AsyncTask class.
Операции над файлами, даже чтение содержимого каталога, однозначно лучше делать в отдельном потоке.
Я пытался делать в основном потоке, но были заметны тормоза UI даже на довольно прокачанном планшете. Да и удобнее так , имхо.
1
17.09.2013, 09:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2013, 09:38
Привет! Вот еще темы с ответами:

TextView бд - Программирование Android
Подскажите можно ли на прямую вызвать из бд в TextView текст?

Из WebView в TextView - Программирование Android
С WebView всё легко. Чтобы загрузить страницу, нужно всего-то воспользоваться одной строкой кода: WebView.loadUrl("http://example.com"); ...

TextView а AlertDialog - Программирование Android
Здравствуйте! Вот столкнулся с такой проблемой, не могу Textview вывести в AlertDialog. Помогите пожалуйста!

AlarmManager и TextView - Программирование Android
Здравствуйте. Задача такая: есть AlarmManager и TextView. Как заставить AlarmManager отсчитывать время, заданное пользователем, и...


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

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

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