0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
1

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

12.03.2014, 15:21. Показов 1147. Ответов 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");
      }
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2014, 15:21
Ответы с готовыми решениями:

Ремонт ПММ BOSCH SKT5002EU берет много соли, Посудомойка берет много соли
Подскажите. У меня ПММ BOSCH SKT5002EU уже 6 лет работает без вопросов. Но в последнее время после...

MessageBox слишком много на себя берет
все просто, если булевская переменная error==False то выводить на экран что-нибудь, если же true, в...

SFML - ест много ресурсов
Всем привет! Сегодня начал знакомится с библиотекой SFML, и после создания первого приложения ( по...

Программа потребляет много ресурсов
Вобщем делаю программу, которая помимо всего прочего имеет в наличии модуль с векторной картой. ...

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

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

Добавлено через 1 минуту
А если вызван блокировщик экрана? Неужели тоже отдельный обработчик писать? Неужели нет ЕДИНОЙ команды - "тебя не видно" или "у тебя видно только такой участок"?
0
325 / 123 / 10
Регистрация: 01.11.2012
Сообщений: 586
13.03.2014, 13:53 6
Я не могу вам подсказать, есть только свои догадки. Лаунчеры это тоже программы. Дают ли они события видимости определенного рабочего стола? Думаю да. Как узнать? Не знаю. Может в новых дроидах и появился какой интерфейс. Ведь сделали же получение события изменения размера виджета с версии 4.0, хотя в лаунчерах такая возможность была задолго до 4-ки.
1
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
13.03.2014, 15:01 7
вывод... пока прийдется ТОЛЬКО оптимизация отрисовки и отлов блокировки экрана... еще одна недоработка гугла!
1
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
14.03.2014, 21:15  [ТС] 8
dubok79,
Цитата Сообщение от dubok79 Посмотреть сообщение
Ну вы же сами написали, что виджет у вас пашет и пашет каждую секунду...вот и результат вам...
Да, но я не могу поверить что простые математические вычисления(я бы даже сказал простейшие и минимальные) ежесекундно могут быть такие ресурсо ёмкие с процессорами которые используют под Андройд.. веть вся суть моей программы это взять теперешную дату и время, записать в переменную.. и потом каждую секунду просто отнимать -1... я возможно не совсем понимаю логики UppdateTimerTask ... и у меня на ряду с орифметическим действием -1 потстоянно берется дата время, тогда более ли мение понятно чего так глючит, но что бы из за того что просто обновление едет каждую секунду, трудно поверить, есть ведь куча программ типа спедометра и всякое такое где суть такая же и даже посложнее алгоритмы но они не капельки не притормаживают и не тянут много ресурсов, в то время как мой виджет со воременем просто даже останавливается и ничего больше не происходит, а на сколько я понмиаю виджет и программа не сильно то так уже по архитектуре разные... но возможно я сильно ошибаюсь, ибо углубленно андройд программирование не изучаю..
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
14.03.2014, 22:05 9
подозреваю что тормозит именно процесс отрисовки/перерисовки виджета, а не только математика.
Мой виджет рисует в памяти картинку типа
https://lh4.ggpht.com/-_42tO19... 5Mp0U=h900
(вторая в https://play.google.com/store/... ious_clock )
на весь экран(учиться же надо на чем-то! ). Потом ее отображает. Каждую линию/квадратик нужно отрисовать. Оптимизации нет. Возможно и быстро, но потом он рисует на виджет всю эту картинку снова. Возможно можно задать только ту часть которая изменилась. Находил часы с секундной стрелкой, которые не сажают "заметно" батарейку (хотя открыты в 3х разных "окнах" экрана в разных скинах), как мой виджет за ночь (70% батареи)

Добавлено через 4 минуты
попробуйте эту математику выводить не на виджет а в обычную программу без прозрачнстей и сделайте замеры проца.
попробуйте эту математику расчитывать и не выводить...
Попробуйте виджет не перерисовывать вообще - пусть просто висит.
Попробуйте на виджет выводить ОДНУ надпись - во сколько раз упадет проц?
Если не жалко, отпишите замеры сюда - мне тоже подобное предстоит, но не сейчас - другим занят...
1
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
15.03.2014, 11:13  [ТС] 10
Цитата Сообщение от Tester64 Посмотреть сообщение
на весь экран
Возможно вы и правы, так как мой виджет так же на весь экран планшета, но в тоже время если вспомнить о существовании живых обой, которые так же на весь экран и при всем на фоне их так же работают виджеты и приложения и там намного сложенее код и отрисовка картин, и так де они не сильно забирают ресурсы, и чесно говоря я как человек углубленно работающий с архитектурой механизмом работы процесоров очень сомневаюсь в том что глуки всего лишь из за размеров, но все возможно Да, я проведу ряд тестов, и потом отпишусь сдесь по результатам ... Обезательно...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2014, 11:13

Программа потребляет слишком много ресурсов
Здравствуйте. Имеется такой код: #include &lt;windows.h&gt; LRESULT CALLBACK WndProc(HWND, UINT,...

Как продвигать много однотипных ресурсов?
Очень нужен совет! Столкнулась с проблемой продвижения довольно большого количество идентичных...

WaitMessage PeekMessage поедают много ресурсов.
Когда я использую ети функции в цыкле они поедают много ресурсов, как получать сообщения и при...

Diagnostics Tracking Service потребляет много ресурсов
После этого необязательного обновления, стал замечать, что эта служба изрядно кушает ресурсы,...


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

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

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