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

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

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

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

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

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

Добавлено через 1 минуту
А если вызван блокировщик экрана? Неужели тоже отдельный обработчик писать? Неужели нет ЕДИНОЙ команды - "тебя не видно" или "у тебя видно только такой участок"?
dubok79
 Аватар для 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,502
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,502
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 Виджет не появляется в списке виджетов
Посоветуйте виджет Android
Виджет детальной информации в андроид Android
Android Найти виджет по изображению
Угадать виджет по рисунку Android

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

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

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