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

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

Войти
Регистрация
Восстановить пароль
 
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
#1

Виджет много ресурсов берет - Программирование Android

12.03.2014, 15:21. Просмотров 684. Ответов 9
Метки нет (Все метки)

Написал виджет на планшет, все работает, но когда ставлю виджет планшет заметно начинает тормазить, при повороте экрана особенно заметно, вообще тормозит, сам виджет обновляется 1 раз в секунду и при этом отсчитывает время ежесекундно как спедометр... Не могу понять в чем проблема, откуда он столько жрет, или если не жрет то в чем может быть проблема..
Вот код:
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
109
110
111
112
113
114
115
116
117
118
119
120
package com.example.vidjet;
 
import java.util.Arrays;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
 
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.TextView;
 
 
 
public class MyWidget extends AppWidgetProvider {
    final String LOG_TAG = "myLogs";
    
    
    
     int[] appwe;
      @Override
      public void onEnabled(Context context) {
        super.onEnabled(context);
 
        
      }
 
    @Override
      public void onUpdate(Context context, AppWidgetManager appWidgetManager,
          int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        RemoteViews remoteviews;
        remoteviews = new RemoteViews(context.getPackageName(),R.layout.widget);
        Date d = new Date();
        appwe = appWidgetIds;
        int day = d.getDate();
 
        int m = d.getMonth();
        int day2 = 0;
        if(m==1){ day2=28-day+36-1;} else if(m==2){day2 = 31-day+5-1;} else day2=5-day-1;
        
 
        int ch = d.getHours();
        int ch1 = 23-ch;
        int min = d.getMinutes();
        int min1 = 59-min;
        int sec = d.getSeconds();
        int sec1 = 59-sec;
        remoteviews.setTextViewText(R.id.textView1, String.valueOf(day2));
        remoteviews.setTextViewText(R.id.textView6, String.valueOf(ch1));
        remoteviews.setTextViewText(R.id.textView8, String.valueOf(min1));
        remoteviews.setTextViewText(R.id.textView10, String.valueOf(sec1));
        appWidgetManager.updateAppWidget(appWidgetIds, remoteviews);
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new UppdateTimerTask(context,appWidgetManager),1,1000);
        
      }
      
      private class UppdateTimerTask extends TimerTask{
          RemoteViews views;
          AppWidgetManager appWidgetManager;
          ComponentName thisWidget;
          int day,m,day2,ch,ch1,min,min1,sec,sec1;
          public UppdateTimerTask(Context context, AppWidgetManager appWidgetManager){
              this.appWidgetManager = appWidgetManager;
              views = new RemoteViews(context.getPackageName(),R.layout.widget);
              thisWidget = new ComponentName(context, MyWidget.class);
                Date d = new Date();
                day = d.getDate();
                m = d.getMonth();
                day2 = 0;
                if(m==1){ day2=28-day+36-1;} else if(m==2){day2 = 31-day+5-1;} else day2=5-day-1;
                
                ch = d.getHours();
                ch1 = 23-ch;
                min = d.getMinutes();
                min1 = 59-min;
                sec = d.getSeconds();
                sec1 = 59-sec;
          }
        @Override
        public void run() {
            sec1--;
            if(sec1<0){
                sec1=60;
                min1--;
                if(min1<0){
                    min1=59;
                    ch1--;
                    if(ch1<0){
                        ch1=23;
                        day2--;
                    }
                }
            }
            views.setTextViewText(R.id.textView1, String.valueOf(day2));
            views.setTextViewText(R.id.textView6, String.valueOf(ch1));
            views.setTextViewText(R.id.textView8, String.valueOf(min1));
            views.setTextViewText(R.id.textView10, String.valueOf(sec1));
            appWidgetManager.updateAppWidget(thisWidget, views);
        }
          
          
      }
 
      @Override
      public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
        Log.d(LOG_TAG, "onDeleted " + Arrays.toString(appWidgetIds));
      }
 
      @Override
      public void onDisabled(Context context) {
        super.onDisabled(context);
        Log.d(LOG_TAG, "onDisabled");
      }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2014, 15:21     Виджет много ресурсов берет
Посмотрите здесь:

Виджет - Программирование Android
на активити виджета у меня есть один textviews, я хочу программно изменить текст этого компонета, но этого не происходит когда я виджет...

Виджет с часами - Программирование Android
Пишу виджет, который показывает время. Запускаю часы на эмуляторе (Android 4.0.3) работает без отказно, запускаю на телефоне (Android...

Посоветуйте виджет - Программирование Android
Привет ребята! Каждая девушка хочет иметь гламурную плюшку:) Не факт что плюшка должна быть функциональной, но факт что очень...

Виджет приложения - Программирование Android
Здравствуйте. Скажите, пожалуйста, как добавить к приложению виджет? Чтобы при установке приложения ставился и виджет, который можно...

Угадать виджет по рисунку - Программирование Android
Добрый день! Как называется данный элемент (выделено стрелкой)? И есть ли он в стандартных элементах?

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

Обработка нажатий на виджет - Программирование Android
Почему не работает при нажатии на виджет? @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
12.03.2014, 21:30     Виджет много ресурсов берет #2
Ну вы же сами написали, что виджет у вас пашет и пашет каждую секунду...вот и результат вам...
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
12.03.2014, 23:39     Виджет много ресурсов берет #3
Цитата Сообщение от dubok79 Посмотреть сообщение
пашет каждую секунду...вот и результат вам...
Присоединяюсь к вопросу! Возникла таже проблема, но отложил в сторонку (пока не критично)
Нормально что жрет до 15-20% проца когда ВИДЕН(на весь экран, больше 100 обьектов, рисую картинку с управляемой прозрачностью), но почему жрет их даже если на другом экране? И самое странное даже после того как удалишь с экрана? Или когда открыл игру на полный экран?
Система это не отлавливает? Или отлавливает, шлет мне сообщение, а я его не замечаю?
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
12.03.2014, 23:49     Виджет много ресурсов берет #4
В системе виджет обновляется не чаще 1 раз в 30 минут. Вы же заставляете его обновляться заметно чаще и не важно виден он или нет. А при удалении, надо его полностью удалять, а не только с экрана.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
13.03.2014, 01:27     Виджет много ресурсов берет #5
Цитата Сообщение от dubok79 Посмотреть сообщение
и не важно виден он или нет
А как узнать виден он или нет?

Добавлено через 2 минуты
Удаление с экрана еще как-то могу отловить, но если перекрыть лейаут другим окном или сдвинуть его в бок на другой экран... Возможно ли отловить? Думаю подобное должно возникать в живых обоях! Неужели они работают даже под игрушками?

Добавлено через 1 минуту
А если вызван блокировщик экрана? Неужели тоже отдельный обработчик писать? Неужели нет ЕДИНОЙ команды - "тебя не видно" или "у тебя видно только такой участок"?
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
13.03.2014, 13:53     Виджет много ресурсов берет #6
Я не могу вам подсказать, есть только свои догадки. Лаунчеры это тоже программы. Дают ли они события видимости определенного рабочего стола? Думаю да. Как узнать? Не знаю. Может в новых дроидах и появился какой интерфейс. Ведь сделали же получение события изменения размера виджета с версии 4.0, хотя в лаунчерах такая возможность была задолго до 4-ки.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
13.03.2014, 15:01     Виджет много ресурсов берет #7
вывод... пока прийдется ТОЛЬКО оптимизация отрисовки и отлов блокировки экрана... еще одна недоработка гугла!
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
14.03.2014, 21:15  [ТС]     Виджет много ресурсов берет #8
dubok79,
Цитата Сообщение от dubok79 Посмотреть сообщение
Ну вы же сами написали, что виджет у вас пашет и пашет каждую секунду...вот и результат вам...
Да, но я не могу поверить что простые математические вычисления(я бы даже сказал простейшие и минимальные) ежесекундно могут быть такие ресурсо ёмкие с процессорами которые используют под Андройд.. веть вся суть моей программы это взять теперешную дату и время, записать в переменную.. и потом каждую секунду просто отнимать -1... я возможно не совсем понимаю логики UppdateTimerTask ... и у меня на ряду с орифметическим действием -1 потстоянно берется дата время, тогда более ли мение понятно чего так глючит, но что бы из за того что просто обновление едет каждую секунду, трудно поверить, есть ведь куча программ типа спедометра и всякое такое где суть такая же и даже посложнее алгоритмы но они не капельки не притормаживают и не тянут много ресурсов, в то время как мой виджет со воременем просто даже останавливается и ничего больше не происходит, а на сколько я понмиаю виджет и программа не сильно то так уже по архитектуре разные... но возможно я сильно ошибаюсь, ибо углубленно андройд программирование не изучаю..
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
14.03.2014, 22:05     Виджет много ресурсов берет #9
подозреваю что тормозит именно процесс отрисовки/перерисовки виджета, а не только математика.
Мой виджет рисует в памяти картинку типа
https://lh4.ggpht.com/-_42tO19azRRp5...ewrz5Mp0U=h900
(вторая в https://play.google.com/store/apps/d...nobvious_clock )
на весь экран(учиться же надо на чем-то! ). Потом ее отображает. Каждую линию/квадратик нужно отрисовать. Оптимизации нет. Возможно и быстро, но потом он рисует на виджет всю эту картинку снова. Возможно можно задать только ту часть которая изменилась. Находил часы с секундной стрелкой, которые не сажают "заметно" батарейку (хотя открыты в 3х разных "окнах" экрана в разных скинах), как мой виджет за ночь (70% батареи)

Добавлено через 4 минуты
попробуйте эту математику выводить не на виджет а в обычную программу без прозрачнстей и сделайте замеры проца.
попробуйте эту математику расчитывать и не выводить...
Попробуйте виджет не перерисовывать вообще - пусть просто висит.
Попробуйте на виджет выводить ОДНУ надпись - во сколько раз упадет проц?
Если не жалко, отпишите замеры сюда - мне тоже подобное предстоит, но не сейчас - другим занят...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2014, 11:13     Виджет много ресурсов берет
Еще ссылки по теме:

Виджет не появляется в списке виджетов - Программирование Android
Разбираю урок 117 проекта startandroid, делаю все как в уроке, но виджет не появляется в списке. Мне кажется, дело в том, что у меня в...

Виджет на весь экран(страницу) - Программирование Android
В layout файле стоит fill_parent. Если в xml файле убрать строки с длиной и шириной, то желаемый результат не получаю. В xml прописать 90%...

Виджет детальной информации в андроид - Программирование Android
Вот например у меня есть список городов во фрагменте(в списке пункт - город). И я хочу следующее чтобы по нажатии на этот пункт...

Запуск Activity по клику на виджет - Программирование Android
ни как не пойму как активити то вызвать из виджета?тост получилось чтоб вылезал, а активность не врублюсь ни как, помогите люди добрые

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


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

Или воспользуйтесь поиском по форуму:
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
15.03.2014, 11:13  [ТС]     Виджет много ресурсов берет #10
Цитата Сообщение от Tester64 Посмотреть сообщение
на весь экран
Возможно вы и правы, так как мой виджет так же на весь экран планшета, но в тоже время если вспомнить о существовании живых обой, которые так же на весь экран и при всем на фоне их так же работают виджеты и приложения и там намного сложенее код и отрисовка картин, и так де они не сильно забирают ресурсы, и чесно говоря я как человек углубленно работающий с архитектурой механизмом работы процесоров очень сомневаюсь в том что глуки всего лишь из за размеров, но все возможно Да, я проведу ряд тестов, и потом отпишусь сдесь по результатам ... Обезательно...
Yandex
Объявления
15.03.2014, 11:13     Виджет много ресурсов берет
Ответ Создать тему
Опции темы

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