Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

Безопасно скачать файл - Программирование Android

03.11.2014, 05:41. Просмотров 537. Ответов 9
Метки нет (Все метки)

Гуру, посоветуйте метод!

Раз в секунду пытаюсь скачать короткий файл с сайта (строку-статуса).
Качается успешно. И слишком быстро что-бы успевало подвиснуть. Но...
Если отключаю WiFi вдруг происходит ПОЛНОЕ зависание программы. Возможно в ожидании таймаута, возможно что-еще...

Как ОБЕЗОПАСИТЬ этот процесс?

Что здесь используют? Асинхронные процессы? потоки? что-нибудь еще? Куда копать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2014, 05:41     Безопасно скачать файл
Посмотрите здесь:

Скачать файл из сети на SD карту - Программирование Android
Доброго времени суток. Есть такой вопрос: получаю ответ от сервера в виде XML-сообщения и разбираю его. Есть ссылки на файлы кот лежат...

Скачать файл при загрузке - Программирование Android
Очень нужна помощь! В программирование на java я 0. Но очень нужно приложение которое при открытие будет скачивать на sd карту файл из...

Скачать интернет файл в строку - Программирование Android
Написал простой php скрипт для "проверки состояния сервера". Результат выполнения скрипта - не больше 100 символов на английском/руском...

Скачать файл .docx и считать из него текст - Программирование Android
Был бы ну очень благодарен за код (да да я знаю это наглость) ,подскажите хот в каком направление двигаться

Скачать небольшой файл и засунуть его в ArrayList<String> - Программирование Android
Есть на сервере xml файл 10кб (такой как SharedPreference на смарте). &lt;?xml version='1.0' encoding='utf-8' standalone='yes' ?&gt; &lt;map&gt;...

Безопасно ли хранить данные в SQLite? - Программирование Android
Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь? Безопасно ли хранить данные в SQLite? Что нужно сделать...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3138 / 1940 / 214
Регистрация: 13.01.2012
Сообщений: 7,428
03.11.2014, 08:02     Безопасно скачать файл #2
разве вы качаете в основном потоке? так же вроде невозможно сделать
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
03.11.2014, 08:18  [ТС]     Безопасно скачать файл #3
Цитата Сообщение от vxg Посмотреть сообщение
разве вы качаете в основном потоке? так же вроде невозможно сделать
Раньше я тоже так думал. Это ДАЛЕКО не основная функция, поэтому не вникал в теорию - нашел, проверил, сработало, подключил... Но загрузка шла по кнопке, а не по таймеру:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        try {
            String ULRStr = "";
            InputStream input1 = null;
            String rep = "";
            ULRStr = "www.mysite.com/1.php";
            URL url = new URL(ULRStr);
            input1 = new BufferedInputStream(url.openStream());
            ByteArrayOutputStream output1 = new ByteArrayOutputStream();
            byte data[] = new byte[1024];
            int count;
            while ((count = input1.read(data)) != -1) {
                output1.write(data, 0, count);
                rep = rep + output1.toString();
            }
            input1.close();
            return ""+rep+"";
        } catch (Exception e) {
            //Log.i("my", "Str_Download Ошибка подключения к сайту!");
            //Log.i("my", e.toString());
            return "";
        }
Как-то так... Цель была напрямую строку из 1.php отправить в парсер на анализ. Без предварительной "игры" с файлом. Там одна строка. От 5 до 500 символов.

Завернул в функцию, снабдил параметрами и загнал в дальний угол класса синхронизации...

А теперь попробовал запустить раз в 5 секунд. Все работает. Но случайно догадался выключить вифи. ВСЯ прога зависла... Надеялся что просто пустую строку получать буду...

Помогите завернуть в отдельный поток ПОПРОЩЕ? А в идеале маленький пример/ссылку!

И желательно... с ПЕРЕЗАПУСКОМ!
Если я правильно понял каждые 5 секунд я буду создавать поток, который будет зависать в случае отсутсвия сети на 20-60 секунд. Вместо того что-бы прекратить ждать и запросить снова...

Назовите хотя-бы как называется технология?
vxg
Модератор
3138 / 1940 / 214
Регистрация: 13.01.2012
Сообщений: 7,428
03.11.2014, 09:20     Безопасно скачать файл #4
мб что то поможет - смысл такой: когда надо стартуем поток в который засунута страшная функция и запускаем хандлер который каждые энцать миллисекунд проверяет не закончился ли поток (если закончился выводим результаты в gui).
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
    private static Thread thread = null;
    private static void startThread() {
        thread = new Thread(new Runnable() {
            public void run() {
                myFunc();
            }
        });
        thread.start();
    }
    private static boolean processed = true;
    private Handler handler;
 
    public static void abort() { //у меня были сокеты
        if (socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
            }
        }
    }
 
    public static void wait(Thread thread) {
        if (thread != null) {
            try {
                thread.join();
            } catch (InterruptedException e) {
            }
        }
    }
 
    public static void interrupt(Thread thread) {
        if (thread != null) {
            thread.interrupt();
        }
    }
    
    public static void clean(Thread thread, Handler handler) {
        interrupt(thread);
        abort();
        wait(thread);
        handler.removeMessages(0);
    }
 
    public static void myFunc() { //ацки тяжелая функция
        
        if (Thread.currentThread().isInterrupted()) {
            return;
        }
 
        while (true) {
            //hard funcs.........
            if (Thread.currentThread().isInterrupted()) {
                break;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
                
        abort();
    }
//---------------------
//когда надо делаем так
        clean(thread, handler);
        
        startThread();
        processed = false;
        handler.sendEmptyMessageDelayed(0, interval);
//----------------
//хандлер выглядит так (создаю при возобновлении активности)
        handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                if (!thread.isAlive()) {
                    processed = true;
                    
                    //gui funcs.................
                } else {
                    handler.sendEmptyMessageDelayed(0, interval);
                }
            }
        };
+ if (!processed) handler.sendEmptyMessage(0) при возобновлении активности + handler.removeMessages(0) при паузе активности + clean(thread, handler) при закрытии = простым как то не поворачивается назвать все это
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
03.11.2014, 10:39     Безопасно скачать файл #5
Что то странно как то. У меня перед операцией с сетью стоит проверка на наличие сети. Аларм менеджер запускает загрузку, сеть есть? - качаем, сети нет - не качаем, ждем следующего тика. При ошибке во время загрузки в худшем случае получаю не полный файл - обычно ексепшн.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
03.11.2014, 21:17  [ТС]     Безопасно скачать файл #6
Спасибо! Попробую разобраться...
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Что то странно как то. У меня перед операцией с сетью стоит проверка на наличие сети. Аларм менеджер запускает загрузку, сеть есть? - качаем, сети нет - не качаем, ждем следующего тика. При ошибке во время загрузки в худшем случае получаю не полный файл - обычно ексепшн.
Думал над этим! Сети бывают разные... Бывает что и сайт может "упасть" при наличии сети. Или хостинг или домен сломался (забыл проплатить). Моя функция скорее индикатор - "есть новости/обновления - предложи юзеру их скачать (вручную)". Еще человек может жить в вифи-сети фирмы за фаерволом - с запрещенным только моим сайтом или даже всеми кроме моего...
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
03.11.2014, 21:22     Безопасно скачать файл #7
Цитата Сообщение от Tester64 Посмотреть сообщение
Бывает что и сайт может "упасть" при наличии сети. Или хостинг или домен сломался (забыл проплатить).
В этом случае вернет текст ошибки с сайта.
Цитата Сообщение от Tester64 Посмотреть сообщение
Еще человек может жить в вифи-сети фирмы за фаерволом - с запрещенным только моим сайтом или даже всеми кроме моего...
В таком случае, думаю, будет IOExeption.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
03.11.2014, 21:53  [ТС]     Безопасно скачать файл #8
Цитата Сообщение от Spelcrawler Посмотреть сообщение
В таком случае, думаю, будет IOExeption.
Цитата Сообщение от Spelcrawler Посмотреть сообщение
В этом случае вернет текст ошибки с сайта.
Я тоже думал! В моем коде (выше) есть ехептион. Но завис!
Хостинг может слишком долго отдавать ошибку. У меня на домашнем "тренировочном" хостинге (на моем-же ноуте) установлен таймаут 30 минут (на случай импортов/экспортов многомебайтных баз). При этом броузер реально висит и ждет пока хостинг закончит формировать страницу. При этом страница может состоять из слова "ок" в самом конце. Могу случайно и бесконечный цикл в РНР устроить. А андроид будет ждать... Надо сделать обязательный таймаут для ожидания! На стороне андроида!
... внешне похоже что совет vxg "срастется", но это за 5 минут не скажешь! Надо потестить, адаптировать под свой проект, потестить на разных сетях...
Пробовал по учебнику (лень искать - "с котиками") загнать в асинхронные - не сработало (может где-то ошибся)... Теперь попробую в потоках!
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
03.11.2014, 22:13     Безопасно скачать файл #9
Цитата Сообщение от Tester64 Посмотреть сообщение
Хостинг может слишком долго отдавать ошибку. У меня на домашнем "тренировочном" хостинге (на моем-же ноуте) установлен таймаут 30 минут (на случай импортов/экспортов многомебайтных баз). При этом броузер реально висит и ждет пока хостинг закончит формировать страницу. При этом страница может состоять из слова "ок" в самом конце. Могу случайно и бесконечный цикл в РНР устроить. А андроид будет ждать...
Если это ваш сервер - поставьте лимит поменьше, если не ваш - не волнуйтесь там не будет пол часа. И работу с сетью в любом случае нужно в отдельном потоке выполнять. На андроиде начиная с 4.0 не выйдет в ui треде использовать сеть - вылетит сразу. Так что просто выносите в отдельный поток и никаких проблем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2014, 04:58     Безопасно скачать файл
Еще ссылки по теме:

Где скачать NDK? - Программирование Android
Подскажите пожалуйста где скачать NDK, ну что б более менее безопасно? Ссылка на офф сайте developer.android.com не работает, на трекере...

Скачать JSON и вывести его - Программирование Android
Здравствуйте! Как сделать, чтобы при входе в программу она скачивала базу JSON с сайта (предположим она лежит здесь &quot; cyberforum.ru/bd.json...

Как скачать и установить Android ? - Программирование Android
Можно ли бесплатно скачать Android ? И если да, то как это сделать ?

Где можно скачать библиотеки? - Basic4Android
Штука вроде не плохая, но без доп. библиотек бесполезная вещь! А где можно скачать эти библиотеки? Давайте делиться ссылками.


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

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
04.11.2014, 04:58  [ТС]     Безопасно скачать файл #10
Цитата Сообщение от Spelcrawler Посмотреть сообщение
На андроиде начиная с 4.0 не выйдет в ui треде использовать сеть - вылетит сразу
Вообще-то у меня 4.03. И все УСПЕШНО работает. Вылетает ТОЛЬКО при отлкючении сети. А лимит... на сервере он правильный, но МНОГИЕ хостеры поднимают его до 15-30 секунд. А этого времени достаточно для того что-бы юзер успел "попытаться" нажать на любой элемент интерфейса и вызвать взаимоблокирующие вызовы...

И функция получилась вполне полезная (без потока)! Например обновления качаю со своего-же сервера. Перед закачкой файла, качаю простую строку-инфо про файл (если большой, то "только через вифи", а вдруг уже его качали, а вдруг временно запретили качать). В результате ОЧЕНЬ быстро получаю короткую строку и в зависимости от результата - двигаюсь дальше...
Yandex
Объявления
04.11.2014, 04:58     Безопасно скачать файл
Ответ Создать тему
Опции темы

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