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

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

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

Активити не уходят из памяти - Программирование Android

22.12.2014, 12:44. Просмотров 511. Ответов 12
Метки нет (Все метки)

Всем доброго дня!

Очень прошу помощи.

Ситуация следующая:

Делаю приложение, от которого требуется постоянное перемещение между активностями. Соответственно, постоянно вызываю новые и закрываю старые. Закрываю старые с помощью finish()
Открываю новые с помощью intent

Так вот, проблема в том, что несколько раз перейти между активностями и памяти ОЗУ уже более 100 МБ занято.
Активности не уходят из памяти.

Думаю, проблема знакомая, подскажите, пожалуйста, как в данном случае поступить?

Пробовал system.exit(0) Все отлично, но читал, что лучше все-таки лучше закрывать с помощью finish()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2014, 12:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Активити не уходят из памяти (Программирование Android):

Как завершить висящее в памяти активити? - Программирование Android
Здравствуйте. Есть приложение, состоящее из 4х активити. Каждое запускается только из предыдущего. На 4ом при определённых действиях(при...

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

Запуск стартовой активити при выгрузке приложения из памяти - Программирование Android
Заметил в некоторых приложениях, что после их сворачивания и разворачивания через некоторое время - запускается стартовый экран. Но если...

На телефоне highscreen 3 на всех активити происходит быстрый самовозврат к главной активити - Программирование Android
Сделал меню в виде ListView. При клике на меню запускаются активити. На эмуляторе работает, на телефоне моем LG все работает. На телефоне...

Как вызвать метод в активити классе из обычного не активити класса? - Программирование Android
Есть активити в котором вводятся логин и пароль. При нажатии кнопки "войти" в отдельном классе "сокетсервер"(+в отдельном потоке)...

Изменение параметров активити из другого активити - Программирование Android
Как сделать так чтобы из первого активити поменять final ImageView img=(ImageView)findViewById(R.id.image1); ...

12
YuraAAA
1576 / 1317 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
22.12.2014, 12:52 #2
rekrut68, попробуйте поставить в манифесте своим активити
XML
1
android:launchMode="singleTask"
(или "singleInstance")
0
rekrut68
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 7
22.12.2014, 13:00  [ТС] #3
Все тоже самое, все равно растет память.
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
22.12.2014, 14:09 #4
rekrut68, здравствуйте!
Честно говоря, незнаком с такой проблемой. Делаю через фрагменты (активностей мало), а память измерять пока не научился. Вы не могли бы показать часть кода? У вас статических переменных нет?
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
22.12.2014, 14:47 #5
Может банально memleak какой-нибудь?
0
rekrut68
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 7
22.12.2014, 15:36  [ТС] #6
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
    @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.category_menu);
        setContentView(R.layout.category_menu);
        
        BIG_CATEGORY = (LinearLayout) findViewById(R.id.BIG_CATEGORY);
       // LinearLayout LL = (LinearLayout) findViewById(R.id.LLay);
        pull = (View) findViewById(R.id.pull);                  
        pull.setOnTouchListener(swype);                             
        e = (EditText) findViewById(R.id.editText8);                
        e.setFocusable(false);                                                          
        lay = (LinearLayout) findViewById(R.id.Lay);                
        _do = new dish_order();                                         
        //pull.setOnTouchListener(swype);
        list_table = new ArrayList<String>();                       
        mHandler = new Handler();
        for (int k=1;k<21;k++) {
            list_table.add(Integer.toString(k));
        }
 
        dm = getResources().getDisplayMetrics();
        
        servername = getIntent().getExtras().getString("server");                       
        cid = getIntent().getExtras().getInt("cid");                                    
        count_category = getIntent().getExtras().getInt("count");                       
        
        try {
            json = new JSONArray(getIntent().getStringExtra("values"));                 
        } catch (JSONException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        
        category_value = new String[json.length()];                     
        id_category = new int[json.length()];                                           
        
       
        parseJSON();                                                    
        draw_button();                                                  
    
    }
 
////////////////////////////РИСОВАНИЕ КНОПОК/////////////////////////////////////////// 
    public void draw_button() {
        
            for (int j=0;j<count_category;j++) {
            
                p = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);     
                p1 = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);    
                tahoma = Typeface.createFromAsset(getAssets(), "fonts/tahoma.ttf");                     
                p.topMargin = 1;                                                                                    
                p.width = LayoutParams.MATCH_PARENT;                    
                
                final int hi = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 70, dm);     
                p.height = hi;                                                                                              
                p.gravity = Gravity.CENTER_HORIZONTAL;                                                          
                p1.topMargin = 0;                                                           
                p1.width = LayoutParams.MATCH_PARENT;
                p1.height = hi;
                p1.gravity = Gravity.CENTER_HORIZONTAL;
            
                btn =  new Button(getApplicationContext());                 
                btn.setId(j);                                                               
                btn.setBackgroundResource(R.drawable.button_direct);                        
                btn.setTextColor(Color.parseColor("#4682B4"));                              
                btn.setTypeface(tahoma, Typeface.NORMAL);                                   
                btn.setTextSize(20);                                                        
                btn.setGravity(Gravity.CENTER);                                             
                btn.setOnClickListener(buttonPress);                                        
                btn.setText(category_value[j]);                                             
            
                if (j==0){
                    lay.addView(btn,p1);                                    
                }
                else {
                    lay.addView(btn,p);                     
                }
            
            
        }
            
    }
 
//////////////////////НАЖАТИЕ НА КАТЕГОРИИ///////////////////////////////////////////// 
public void send_query(int idp) {
        
        
        
            progressDialog = ProgressDialog.show(this, null, null, true, false);            
            progressDialog.setContentView(R.layout.progr);
        
            set_id = id_category[idp];                          
        
            DataString = Integer.toString(cid)+";"+Integer.toString(set_id);    
            hc = new HttpClass(servername,4,DataString,this);           
            hc.execute();
        
    }
//////////////////////////////////////////////////////////////////////////////////////
 
/////////////////////ПОКАЗ ДОП ВЬЮ СО СПИСКОМ БЛЮД///////////////////////////////////////////// 
public void currentOrderView() {
        
            l_common = (LinearLayout) findViewById(R.id.LLAY1);                 
            l_inner = (LinearLayout) findViewById(R.id.LLay);                       
         
            lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);    
            lp1 = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);   
         
            yo = (TextView) findViewById(R.id.your_order);              
            tahoma = Typeface.createFromAsset(getAssets(), "fonts/Mistral.ttf");            
            yo.setTypeface(tahoma); 
            yo.setTextSize(25);                                         
         
            tb = (TextView) findViewById(R.id.table_number);                                
            sp = (Spinner) findViewById(R.id.table_num);                                    
         
            adapter = new ArrayAdapter<String>(this,R.layout.spinner, list_table);  
            adapter.setDropDownViewResource(R.layout.spinner);                              
            tb.setTypeface(tahoma);                                                                 
            tb.setTextSize(25);                                                                         
         
            sp.setAdapter(adapter);                                     
         
            final int width_tv = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, dm);  
            final int heigth_tv = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, dm);  
         
            lp1.width = width_tv;
            lp1.height = heigth_tv;
            lp1.topMargin = 3;                                      
            lp1.gravity = Gravity.CENTER;                                   
            final int hil = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, dm);       
            l_common.setLayoutParams(lp);                                                           
         
            int count = _do._selected_items.size();                         
         
            for (int j=0;j<count;j++) { 
         
                    tv = new TextView(this);            
                    tv.setBackgroundResource(R.drawable.back);                          
                    tv.setTextSize(15);                                                 
             
                    tv.setText(_do._selected_values.get(j));                            
             
                    tv.setTextColor(Color.WHITE);                                           
                    tv.setGravity(Gravity.CENTER);                                      
                    tv.setId(j);                                                            
                    l_inner.addView(tv,lp1);            
            } 
         
            if (count!=0) {                                                             
             
                //////////параметры для кнопки//////////////////
                    confirm = (LinearLayout) findViewById(R.id.confirm_button);
                    params_button = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
                    final int width_button = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, dm);
                    final int heigth_button = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 40, dm);
                    params_button.width = width_button;
                    params_button.height = heigth_button;
                    params_button.topMargin = 7;
                    params_button.bottomMargin = 2;
             ///////////////////ставим кнопку//////////////////////////
                    btn = new Button(this);
                    btn.setBackgroundResource(R.drawable.button_order);
                    btn.setText("Подтвердить");
                    btn.setTextColor(Color.parseColor("#4682B4"));
                    btn.setId(88);
                    
                    btn.setOnTouchListener(confirm_order);
                    confirm.addView(btn,params_button);
             
            }
         
            orderView = true;               
    }
//////////////////////////////////////////////////////////////////////////////////////////////
 
 
    OnTouchListener confirm_order = new OnTouchListener() {
        
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            
            b = (Button) findViewById(v.getId());
            
            switch (event.getAction()) {
            
                    case MotionEvent.ACTION_DOWN:
                        
                            output_array = new JSONArray();     
                            sp = (Spinner) findViewById(R.id.table_num);                        
                            tn = sp.getSelectedItem().toString();
                            
                            
                            b.setTextColor(Color.parseColor("#DCDCDC"));
                    
                            for (int j=0;j<_do._selected_items.size();j++) {
                        
                                    
                                    output_array.put(_do._selected_items.get(j));       
                        
                            }
                    
                            send_confirm(output_array,tn);      
                            break;
                    
                    case MotionEvent.ACTION_UP: 
                            
                            
                            b.setTextColor(Color.parseColor("#4682B4"));
                            break;
            
            }
            
            
            
            return false;
        }
    };
    
    
/////////////////////////////ОБРАБОТКА ПОДТВЕРЖДЕНИЯ/////////////////////////////////////////////// 
    public void send_confirm(JSONArray oa,String t) {
            tt = (TextView) findViewById(R.id.your_order);
            progressDialog = ProgressDialog.show(this, null, null, true, false);            
             progressDialog.setContentView(R.layout.progr);
            DataString = Integer.toString(cid)+";"+t+";"+oa;                                
            hc = new HttpClass(servername,5,DataString,this);                       
            hc.execute();
            System.out.println("JSON:"+DataString);
        
    }
/////////////////////////////////////////////////////////////////////////////////////////////////
    
    
    
///////////////////////ПРИЕМ ДАННЫХ ОТ СЕРВЕРА////////////////////////////////////////////////////  
    @Override
    public void onGetDataComplete(String result) {
        // TODO Auto-generated method stub
                progressDialog.dismiss();                               
                System.out.println(result);
                js = null;                                  
                items = null;                                   
                id_order = null;                                    
                hc.cancel(true);
                
                hc = null;
                int count_items;                                        
                try {
                    js = new JSONObject(result);                
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    res = js.getString("res");                  
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        
                try {
                    id_order = js.getString("id_order");                
                } catch (JSONException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
        
                try {
                    items = js.getJSONArray("items_menu");      
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
            
                    e.printStackTrace();
                    
                }
        
        
        
                if (items != null) {                                        
                        count_items = items.length();
                        in = new Intent(this,items_list.class);     
                        in.putExtra("cid", cid);                                
                        in.putExtra("servername", servername);
                        in.putExtra("count", count_items);
                        in.putExtra("values", items.toString());
                        System.out.println(items);
                        startActivity(in);  
                }
        
                if (id_order != null) {                                     
                        
                        finish();                                           
                }
        
        
    }
}
0
rekrut68
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 7
22.12.2014, 15:37  [ТС] #7
Вот к примеру Код активити:

запускается из другой активити по intent

и закрывается либо с помощью кнопки BACK, либо с другой кнопки

примерно вот такой код
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
22.12.2014, 16:11 #8
rekrut68, код, конечно, вы неплохо пишете. А теперь давайте искать утечки памяти.
Во-первых, зачем вам везде public? Вы вызываете эти методы из других классов? Замените-ка на private, проверьте, может быть, у вас есть лишние вызовы.
Во-вторых, надо бы поглядеть на использование ресурсов. Возможно, они выделяют память, но при выходе почему-то не освобождают. Имею в виду процедуру currentOrderView.
В-третьих, может быть, OnTouchListener confirm_order у вас не обнуляется. В общем, сложно сказать.
0
rekrut68
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 7
22.12.2014, 17:02  [ТС] #9
Посмотрите, пожалуйста, весь код, там 4 класса:

первым запускается login_frame, затем по кнопке запускается main_frame, затем по кнопке category_menu

и к примеру по кнопке в классе category_menu возвращаясь к main_frame, она остается в памяти.

HttpClass для всех общий, через него осуществляются посылки на сервер.
0
Вложения
Тип файла: rar code.rar (18.6 Кб, 0 просмотров)
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
22.12.2014, 17:26 #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
Может банально memleak какой-нибудь?
На java под андроидом? Это я даже не знаю что нужно сделать чтобы до 100 метров дошла утечка.
Цитата Сообщение от CoolMind Посмотреть сообщение
Замените-ка на private, проверьте, может быть, у вас есть лишние вызовы.
Это уж точно не повлияет.
rekrut68, повертите экран, и замерьте memory monitor'ом (если android studio используете) как память меняется при поворотах и как при переходах между активити, если примерно одинаково - значит какие-то ресурсы тяжелые плодите.
0
rekrut68
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 7
22.12.2014, 17:50  [ТС] #11
в общем такая ситуация: при повороте экрана, память утекает совсем немного, примерно на 0,5 МБ, это мелочи,
Но при переходе, как будто старая активность вообще неудаляется, там память не чистится и доходит до 15-20 за один переход.
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
22.12.2014, 17:53 #12
rekrut68, тогда пишите после каждого
Java
1
startActivity(intent);
finish();
0
rekrut68
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 7
22.12.2014, 19:41  [ТС] #13
везде где нужно и так это сделано. и даже когда finish, все равно жрет память.
Как я понял, основной момент в классе category_menu

Добавлено через 1 час 0 минут
Может вопрос в том, что я не на то заморачиваюсь, и не там смотрю, т.к. сейчас убрал вообще все, убрал передачу данных между активити, в onCreate слудющей оставил только setcontentview и все, все равно идет рост.

Смотрю я в Диспетчере задач на самсунге, а допустим программой Memory Usage 33Мб, как было так и есть
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2014, 19:41
Привет! Вот еще темы с ответами:

Отображение активити поверх другого активити - Программирование Android
Ребят подскажите пожалуйста как такое сделать. Есть активити с картой, по нажатию кнопки настройки, нужно открыть активити с настройками,...

Вызов новой активити не из класса активити - Программирование Android
Есть 4 класса: 1) WelcomeActivity; 2) MainActivity; 3) PopUpActivity; 4) Client. Программа работает с сервером и получает...

Не уходят HTTPS - Delphi
В общем такая проблема, есть сайт www.coinwallet.eu (не реклама). Если изменить с HTTPS на HTTP, запросы отправляет! Но сразу происходит...

уходят деньги с симки - Смартфоны
доброго времени суток. каждый раз при пополнении баланса приходит смс сообщение от номера 770767: Вам продлена услуга на сайте service1 ....


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
22.12.2014, 19:41
Ответ Создать тему
Опции темы

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