|
Página 1 de 1
|
[ 13 Mensagens ] |
|
[RESOLVIDO] Lista muito pesada, alternativas
| Autor |
Mensagem |
|
filipe_moraes
Anatomy of an App
Data de registro: 01 Jun 2012, 12:50 Mensagens: 164
|
 [RESOLVIDO] Lista muito pesada, alternativas
Olá pessoal. Eu tenho uma lista com registros separados por mês, ou seja, primeiro pego os registros de "janeiro", depois "fevereiro", etc... Para montar a lista eu não estou usando XML, faço diretamente por código. Faço um while para cada mês e vou imprimindo os registros em tela.
Acontece que está muito lenta, para abrir 17 registros demora cerca de 7 a 10 segundos. Imagina se tiver muito mais, 7 segundos já é muito para a paciência de qualquer um hoje em dia...
Alguém tem ideia de como posso fazer melhor? Eu sei que se usar XML + spinner deve resolver o problema, mas acontece que tenho diversas querys, uma para cada mês, e para cada mês tenho um separador com o nome do mês e só depois os registros daquele mês.
Agradeço a ajuda.
_________________Happy Day - Nunca mais se esqueça das datas especiais, envia sms automaticamente no dia da comemoração! https://play.google.com/store/apps/details?id=br.com.happydayfreeCaso tenha encontrado sua solução, coloque como [RESOLVIDO] para facilitar a dúvida de outros. http://www.portalandroid.org- Tudo sobre o Android. JESUS VOLTARÁ! Não sabe quem é? Procure, ainda há tempo.
Editado pela última vez por filipe_moraes em 29 Ago 2012, 14:53, num total de 1 vezes
|
| 23 Ago 2012, 18:27 |
|
 |
|
thiprogramador
Android application
Data de registro: 01 Nov 2010, 17:29 Mensagens: 93
|
 Re: Lista muito pesada, alternativas
Sua base de dados é no Android ou remoto?
Porque você não traz tudo de uma vez e gera a lista?
Para deixar um pouco mais rápida, atribua a tabela um campo que tenha o número do mês, dai você cria um índice para esse campo e quando for consultar por mês é só comparar com esse campo. Isso vai ajudar um pouco.
Poste o código e mais informações para analisarmos.
_________________ Não existem problemas e sim soluções!
|
| 23 Ago 2012, 22:51 |
|
 |
|
filipe_moraes
Anatomy of an App
Data de registro: 01 Jun 2012, 12:50 Mensagens: 164
|
 Re: Lista muito pesada, alternativas
Olá, obrigado pelo seu tempo. A base de dados é do android. O índice já existe, tenho o campo mes para facilitar.
O problema e que não posso trazer tudo de uma vez, porque tenho o seguinte: 1 - query para trazer os registros do mês corrente e do dia corrente. ( hoje ) 2 - query para trazer os registros do mês corrente mas a partir dia seguinte até ao fim do mês ( os dias que ainda restam no mês ) 3 - query para trazer janeiro 4- query para trazer março ...
Para cada query tenho um separador como o respectivo nome do mês, ou no caso da primeira e segunda query, "hoje" e "resto do mês" respectivamente.
Estou trocando tudo que é objeto gerado por código e inserindo no xml para ver se resulta. Se alguém souber de uma alternativa melhor, agradecia.
_________________Happy Day - Nunca mais se esqueça das datas especiais, envia sms automaticamente no dia da comemoração! https://play.google.com/store/apps/details?id=br.com.happydayfreeCaso tenha encontrado sua solução, coloque como [RESOLVIDO] para facilitar a dúvida de outros. http://www.portalandroid.org- Tudo sobre o Android. JESUS VOLTARÁ! Não sabe quem é? Procure, ainda há tempo.
|
| 23 Ago 2012, 23:22 |
|
 |
|
igor.chemin
Android application
Data de registro: 22 Nov 2011, 12:58 Mensagens: 84
|
 Re: Lista muito pesada, alternativas
Teria como vc posta o código para da uma olhada? Acho que ficaria, mas fácil para tentarmos te ajudar!
|
| 24 Ago 2012, 10:18 |
|
 |
|
filipe_moraes
Anatomy of an App
Data de registro: 01 Jun 2012, 12:50 Mensagens: 164
|
 Re: Lista muito pesada, alternativas
Olá. Penso que não estou a fazer as conexões a base de dados da maneira correta. Na minha aplicação, tenho um botão que ao clicar, faz conexão com a base de dados e retorna os dados necessários. Cada vez que clico nesse botão, vou ao "gestor de tarefas" do aparelho e verifico que a memória RAM utilizada aumenta, e mesmo após fechar a activity não diminuiu, ou seja, cada vez que clico no botão só aumenta a utilização da memoria RAM. Eu vi que chegou a 64MB e 40% da CPU.
É normal isso acontecer? ou ao fechar a activity deveria diminuir a memoria RAM utilizada. Obrigado.
_________________Happy Day - Nunca mais se esqueça das datas especiais, envia sms automaticamente no dia da comemoração! https://play.google.com/store/apps/details?id=br.com.happydayfreeCaso tenha encontrado sua solução, coloque como [RESOLVIDO] para facilitar a dúvida de outros. http://www.portalandroid.org- Tudo sobre o Android. JESUS VOLTARÁ! Não sabe quem é? Procure, ainda há tempo.
|
| 25 Ago 2012, 11:54 |
|
 |
|
A H Gusukuma
Dalvik Virtual Machine
Data de registro: 17 Jul 2011, 10:55 Mensagens: 1990 Localização: São Paulo
|
 Re: Lista muito pesada, alternativas
Olá Sem código fica difícil. Posta pelo menos o código do botão que faz aumentar a memória.
_________________Abraços ___________ Novo App: CalcMat - Calculadora de materiais para concreto Blog: Agorandroid - sobre programação Android Twitter: @Agorandroid ___________ Campanha: Facilite sua vida e a dos outros usuários Netiqueta:Procure responder as sugestões. Quando encontrar a solução, coloque [Resolvido] no primeiro post o mais rápido possível. Lembre-se de agradecer às pessoas que ajudaram e poste a solução do problema.
|
| 25 Ago 2012, 19:40 |
|
 |
|
filipe_moraes
Anatomy of an App
Data de registro: 01 Jun 2012, 12:50 Mensagens: 164
|
 Re: Lista muito pesada, alternativas
Olá. Vou postar o código abaixo. Reparei em uma coisa, quando removo a aplicação e volto a instala-la, a utilização da memoria RAM fica nos 11/12 MB, porém ao fechar a aplicação e abrir novamente, passa a 24MB, depois fechei e abri novamente passou para 34MB... e assim vai aumentando e só para de aumentar se desinstalar a aplicação e voltar a instalar ou fazer um "kill" pelo "gestor de tarefas". Como o "gestor de tarefas" contabiliza a memoria utilizada? Pelo que entendi esta acumulando e não voltando ao inicio. Estou usando na minha aplicação um scheduler, através do "AlarmManager". Será que é por isso? Penso que não. Aplicação como o foursquare, por exemplo, no meu aparelho chegar a consumir 32MB da memoria RAM, mas se desligar a aplicação e voltar a abri-la volta ao normal, consome 11MB. Porque é que a minha aplicação continua a acumular esses valores? se eu abrir e fechar a minha aplicação 12 vezes, chega a 140MB, o que leva a travar o aparelho por alguns instantes. Penso que a solução do problema afinal não está na reformulação da lista mas sim na resolução do problema acima. Porque minha aplicação está consumindo cada vez mais memória ao abrir e fecha-la? De qualquer forma segue o fonte da activity principal: //Carregando dados para a lista de datas Cursor DATAS; DATAS = db. seek("datas", null, 0, "ASC"); DATAS. moveToFirst(); //verifica se encontrou algum registro if(DATAS. getCount()> 0){ DATAS. close(); //db.close(); //Carrega o layout XML que contem os separadores "Hoje, resto do mês, janeiro, fevereiro..." LayoutInflater inflate = (LayoutInflater ) getSystemService (Context. LAYOUT_INFLATER_SERVICE); LinearLayout LL = (LinearLayout ) inflate. inflate(R. layout. listmonth, null); LL. setLayoutParams(new RelativeLayout. LayoutParams(LayoutParams. FILL_PARENT, LayoutParams. WRAP_CONTENT)); listPanel. addView(LL ); Calendar cDt = Calendar. getInstance(); String cY = Integer. toString(cDt. get(Calendar. YEAR)); String cM = Integer. toString(cDt. get(Calendar. MONTH)); String cD = Integer. toString(cDt. get(Calendar. DAY_OF_MONTH)); int nM = cDt. get(Calendar. MONTH); int nD = cDt. get(Calendar. DAY_OF_MONTH); String cW = ""; String cTituloSeparador = ""; String cDzero = nD< 10? "0"+cD:cD; for(int nC= 1; nC<= 14; nC++ ){ //para separar por "Hoje","Ainda esse mes","Janeiro","Fevereiro"... switch (nC ) { case 1: String[] aData = fData (nD,nM, 0, 0); cTituloSeparador = this. getString(R. string. hoje)+ " "+cDzero+ " "+aData [1]+ ", "+cY; cW = "mes='"+cM+ "' AND dia='"+cD+ "'"; break; case 2: cW = "mes='"+cM+ "' AND dia>'"+cD+ "'"; break; default: if((nC -3)==nM ){cW = "mes='"+ Integer. toString((nC -3))+ "' AND dia<'"+cD+ "'"; }else{cW = "mes='"+ Integer. toString((nC -3))+ "'"; } break; } //Processa os registros encontrados DATAS = db. seek("datas",cW, 0, "ASC"); DATAS. moveToFirst(); if(DATAS. getCount()> 0){ //Altera as propriedades do separador if(nC== 1){ TextView TV = (TextView ) LL. findViewWithTag(Integer. toString(nC )); TV. setText(cTituloSeparador ); } while (!DATAS. isAfterLast()) { int nId = DATAS. getInt(DATAS. getColumnIndex(pk ))+1000; //Busca o contentor correspondente para o mes do registro atual LinearLayout LL_CONT = (LinearLayout ) LL. findViewWithTag(Integer. toString(nC +19)); //Carrega os layout XML para cada registro encontrado LayoutInflater inflateDatas = (LayoutInflater ) getSystemService (Context. LAYOUT_INFLATER_SERVICE); RelativeLayout RL = (RelativeLayout ) inflateDatas. inflate(R. layout. listdatas, null); RL. setId(nId ); RL. setOnClickListener(fEdit ); RL. setOnLongClickListener(fMultiSelect ); LL_CONT. addView(RL ); //Imagem de acordo com o envio ImageView IV_ENV = (ImageView ) RL. findViewById(R. id. ivenv); //Nome da pessoa TextView TV_NOME = (TextView ) RL. findViewById(R. id. tvnome); TV_NOME. setText(DATAS. getString(DATAS. getColumnIndex("nome"))); //Último envio String cTxtCort = this. getString(R. string. ultimo_envio)+ ": "; if(DATAS. getString(DATAS. getColumnIndex("ultenv"))== null){ cTxtCort = cTxtCort + this. getString(R. string. sem_registro); IV_ENV. setImageResource(R. drawable. relogioc); }else{ String cData = DATAS. getString(DATAS. getColumnIndex("ultenv")). replaceAll(" ", ""); String[] a = cData. split("-"); String[] aD = a [0]. split("/"); String[] aH = a [1]. split(":"); int nDia = Integer. parseInt(aD [0]); int nMes = Integer. parseInt(aD [1]); int nHora = Integer. parseInt(aH [0]); int nMinu = Integer. parseInt(aH [1]); String cDia = nDia< 10? "0"+ Integer. toString(nDia ): Integer. toString(nDia ); String cMes = nMes< 10? "0"+ Integer. toString(nMes ): Integer. toString(nMes ); String cHora = nHora< 10? "0"+ Integer. toString(nHora ): Integer. toString(nHora ); String cMinu = nMinu< 10? "0"+ Integer. toString(nMinu ): Integer. toString(nMinu ); cTxtCort = cTxtCort + " "+ cDia+ "/"+cMes+ "/"+aD [2]+ " - "+cHora+ ":"+cMinu; int nUEnv = DATAS. getInt(DATAS. getColumnIndex("ultok")); if(nUEnv== 0){ IV_ENV. setImageResource(R. drawable. relogiov); }else if(nUEnv== 1){ IV_ENV. setImageResource(R. drawable. relogioa); }else{ IV_ENV. setImageResource(R. drawable. relogiol); } } //Texto com o ultimo envio TextView TV_ENV = (TextView ) RL. findViewById(R. id. tvenv); TV_ENV. setText(cTxtCort ); //Verifica se tem algum alarme programado Cursor AL = db. seek("alarms", "keyalarm='"+DATAS. getString(DATAS. getColumnIndex("keyalarm"))+ "' AND ativo='1'", 2, "ASC"); AL. moveToFirst(); ImageView IV_AL = (ImageView ) RL. findViewById(R. id. ival); if(AL. getCount()> 0){ RelativeLayout. LayoutParams IV_AL_PARAM = (android. widget. RelativeLayout. LayoutParams) IV_AL. getLayoutParams(); IV_AL_PARAM. width = fPxToDpi (25); IV_AL_PARAM. height = fPxToDpi (25); IV_AL. setLayoutParams(IV_AL_PARAM ); }else{ RL. removeView(IV_AL ); } AL. close(); //verifica se a opção de envio automatico está programada ImageView IV_SMS = (ImageView ) RL. findViewById(R. id. ivsms); if(DATAS. getInt(DATAS. getColumnIndex("auto"))== 1){ RelativeLayout. LayoutParams IV_SMS_PARAM = (android. widget. RelativeLayout. LayoutParams) IV_SMS. getLayoutParams(); IV_SMS_PARAM. width = fPxToDpi (25); IV_SMS_PARAM. height = fPxToDpi (25); IV_SMS. setLayoutParams(IV_SMS_PARAM ); if(nPosId== 1){IV_SMS_PARAM. addRule(RelativeLayout. RIGHT_OF,IV_AL. getId()); } else{IV_SMS_PARAM. addRule(RelativeLayout. RIGHT_OF,RL_ENV. getId()); } }else{ RL. removeView(IV_SMS ); } //Data da comemoracao Calendar c = Calendar. getInstance(); String cDia = DATAS. getInt(DATAS. getColumnIndex("dia"))< 10? "0"+DATAS. getString(DATAS. getColumnIndex("dia")):DATAS. getString(DATAS. getColumnIndex("dia")); String[] aData = fData (DATAS. getInt(DATAS. getColumnIndex("dia")),DATAS. getInt(DATAS. getColumnIndex("mes")),DATAS. getInt(DATAS. getColumnIndex("hora")),DATAS. getInt(DATAS. getColumnIndex("minu"))); int nDias = difInDays (Integer. parseInt(aData [4]),DATAS. getInt(DATAS. getColumnIndex("mes")),DATAS. getInt(DATAS. getColumnIndex("dia"))); String cDias = nDias< 10? "(0"+ Integer. toString(nDias ): "("+ Integer. toString(nDias ); if(nDias> 1){cDias = cDias+ " dias)"; } else{cDias = cDias+ " dia)"; } TextView TV_COM = (TextView ) RL. findViewById(R. id. tvcom); TV_COM. setText(aData [3]+ " "+cDia+ " "+aData [1]+ ", "+aData [4]+ " "+cDias ); //Pula para o proximo registro encontrado DATAS. moveToNext(); } }else{ //remove do layout o mês que não tem registros LinearLayout LL_CONT = (LinearLayout ) LL. findViewWithTag(Integer. toString(nC +19)); LL. removeView(LL_CONT ); } DATAS. close(); } db. close(); Muito obrigado pela vossa ajuda.
_________________Happy Day - Nunca mais se esqueça das datas especiais, envia sms automaticamente no dia da comemoração! https://play.google.com/store/apps/details?id=br.com.happydayfreeCaso tenha encontrado sua solução, coloque como [RESOLVIDO] para facilitar a dúvida de outros. http://www.portalandroid.org- Tudo sobre o Android. JESUS VOLTARÁ! Não sabe quem é? Procure, ainda há tempo.
|
| 25 Ago 2012, 20:20 |
|
 |
|
A H Gusukuma
Dalvik Virtual Machine
Data de registro: 17 Jul 2011, 10:55 Mensagens: 1990 Localização: São Paulo
|
 Re: Lista muito pesada, alternativas
Quantos registros você tem no db? Esse é um caso típico para ListView que reaproveita views, o aumento da memória deve estar relacionado à criação de views por código.
_________________Abraços ___________ Novo App: CalcMat - Calculadora de materiais para concreto Blog: Agorandroid - sobre programação Android Twitter: @Agorandroid ___________ Campanha: Facilite sua vida e a dos outros usuários Netiqueta:Procure responder as sugestões. Quando encontrar a solução, coloque [Resolvido] no primeiro post o mais rápido possível. Lembre-se de agradecer às pessoas que ajudaram e poste a solução do problema.
|
| 25 Ago 2012, 20:35 |
|
 |
|
filipe_moraes
Anatomy of an App
Data de registro: 01 Jun 2012, 12:50 Mensagens: 164
|
 Re: Lista muito pesada, alternativas
Tenho cerca de 20 registros na BD. Mas ao encerrar a aplicação não deveria "reiniciar" o uso da memoria? É que cada vez que fecho e volto a abrir, consome mais memoria, até o aparelho travar, voltando ao normal somente se for no "gestor de tarefas" e terminar a aplicação. Ao fechar a aplicação, a memoria deveria ser liberada, porque esta "acumulando"?
Obrigado pela sua ajuda.
_________________Happy Day - Nunca mais se esqueça das datas especiais, envia sms automaticamente no dia da comemoração! https://play.google.com/store/apps/details?id=br.com.happydayfreeCaso tenha encontrado sua solução, coloque como [RESOLVIDO] para facilitar a dúvida de outros. http://www.portalandroid.org- Tudo sobre o Android. JESUS VOLTARÁ! Não sabe quem é? Procure, ainda há tempo.
|
| 25 Ago 2012, 20:40 |
|
 |
|
A H Gusukuma
Dalvik Virtual Machine
Data de registro: 17 Jul 2011, 10:55 Mensagens: 1990 Localização: São Paulo
|
 Re: Lista muito pesada, alternativas
Como está fechando o app? Está usando Back ou Home?
_________________Abraços ___________ Novo App: CalcMat - Calculadora de materiais para concreto Blog: Agorandroid - sobre programação Android Twitter: @Agorandroid ___________ Campanha: Facilite sua vida e a dos outros usuários Netiqueta:Procure responder as sugestões. Quando encontrar a solução, coloque [Resolvido] no primeiro post o mais rápido possível. Lembre-se de agradecer às pessoas que ajudaram e poste a solução do problema.
|
| 25 Ago 2012, 20:45 |
|
 |
|
filipe_moraes
Anatomy of an App
Data de registro: 01 Jun 2012, 12:50 Mensagens: 164
|
 Re: Lista muito pesada, alternativas
Estou usando o back. E ao pressiona-lo, chama uma função na minha aplicação, a "onBackPressed". No fonte abaixo, substitui o "finish()" por "android.os.Process.killProcess(android.os.Process.myPid())". Resultou, mas não entendo qual a diferença nem mesmo se é seguro usar isso. //Função que será chamada ao pressionar o botão back do aparelho public void onBackPressed (){ if(!bAlert ){ bAlert = true; final Alert alert = new Alert (this); alert. setType(1); alert. setImageResource(R. drawable. sair); alert. setTitle(AniversarioSemXmlActivity. this. getString(R. string. desligar). toUpperCase()); alert. setText("Fechar aplicação"); alert. show(); alert. setPositiveButton(new OnClickListener (){ public void onClick (View v ){ alert. close(true); finish (); } }); alert. setNegativeButton(new OnClickListener (){ public void onClick (View v ){ alert. close(false); bAlert = false; } }); return; } } Obrigado.
_________________Happy Day - Nunca mais se esqueça das datas especiais, envia sms automaticamente no dia da comemoração! https://play.google.com/store/apps/details?id=br.com.happydayfreeCaso tenha encontrado sua solução, coloque como [RESOLVIDO] para facilitar a dúvida de outros. http://www.portalandroid.org- Tudo sobre o Android. JESUS VOLTARÁ! Não sabe quem é? Procure, ainda há tempo.
|
| 25 Ago 2012, 20:56 |
|
 |
|
A H Gusukuma
Dalvik Virtual Machine
Data de registro: 17 Jul 2011, 10:55 Mensagens: 1990 Localização: São Paulo
|
 Re: Lista muito pesada, alternativas
_________________Abraços ___________ Novo App: CalcMat - Calculadora de materiais para concreto Blog: Agorandroid - sobre programação Android Twitter: @Agorandroid ___________ Campanha: Facilite sua vida e a dos outros usuários Netiqueta:Procure responder as sugestões. Quando encontrar a solução, coloque [Resolvido] no primeiro post o mais rápido possível. Lembre-se de agradecer às pessoas que ajudaram e poste a solução do problema.
|
| 26 Ago 2012, 08:09 |
|
 |
|
filipe_moraes
Anatomy of an App
Data de registro: 01 Jun 2012, 12:50 Mensagens: 164
|
 Re: Lista muito pesada, alternativas
Ok, obrigado pela vossa ajuda. Concluí que a melhor solução no momento é mesmo fazer o "android.os.Process.killProcess(android.os.Process.myPid())" no método "onDestroy". A H Gusukuma, ao ler os artigos percebi que teria que refazer toda a minha aplicação. Muito obrigado pelas dicas. Como é a primeira aplicação, penso que vou deixa-la assim mesmo, consegui reduzir bem a utilização da memoria, mas para melhorar de vez só mesmo refazendo aplicando as dicas dos artigos.
Obrigado.
_________________Happy Day - Nunca mais se esqueça das datas especiais, envia sms automaticamente no dia da comemoração! https://play.google.com/store/apps/details?id=br.com.happydayfreeCaso tenha encontrado sua solução, coloque como [RESOLVIDO] para facilitar a dúvida de outros. http://www.portalandroid.org- Tudo sobre o Android. JESUS VOLTARÁ! Não sabe quem é? Procure, ainda há tempo.
|
| 27 Ago 2012, 12:39 |
|
|
|
Página 1 de 1
|
[ 13 Mensagens ] |
|
Quem está online |
Usuários vendo este fórum: ac0502, ademilson, adenilsonsena, adilson, adilson.afl, agtavares, akaytatsu, alberto, Alexandrercarvalho, alexcost2002, alexmarcolongo, alexsander.miranda, alexvbh, amos, Andre, andreluiz, Antonio Carlos, antoniodourado, apoena, ARAKINIDIO, arnaldo.miranda, BloggerCaOS, brazucx, bruno.abd, btleandro, Caique, CalleHard, Carla Luz, Carlos Almeida, carlos.macleod, Carmizini, cassianotartari, Celso Jr., charly, Christiane, Comandante Cody, comolatti, craudiao, Darkluna, dchechetto, Delão, dentimskol, dobau, Dorpho, Douglas Siviotti, Dudi_FC, edsonel, epsilva, felipe.cintra, fernandodotnet, Filipe larizzatti, filipe_moraes, flaviojps, fraga, frankmendes, Gabriel Teófilo, gabrielatme, geco, gfgodoy, gphonemania, guiba_picolino, GuilhermeZampieri, henrique.cardoso, ismaelbpaiva, jacksonst, jasn, Javanês, jgfelix, jhhm_2008, jhou, jlucasps, jwv, Ki-Adi-Mundi, lalaine, lfirpo, lhdiassilva, lkunta, Lord, LucasNascimento, lucastgomes, lucianoedipo, luizcarlosvb, Luna, Mace Windu, marciosoliveira, marcosf63, martins, masf_33, mauriciobreide, mayahaslinger, Mayara Trevisol, mcurtis, memnoch, miguel, mrangel, mravel, nandopierre, navegador, neviim, Nice, niloleite, nsansilva, Nute Gunray, o-raposa, onaiggac, PAMinhoto, pamonteiro, paulanegreiros, peixe, pemam.com.br, phobos, phpower1, polonia, Qui-Gon Jinn, Rafael Alencar, regeriob2br, reginaldo, renatocoliveira, rfrafael, roberto caceres, robsonrg, rocha, RodReis, romuloigor, rotmeil, Samantha, sasuke_sarutobi, Shinigami, sjta, suissa, taluna, tchou, teamamus, thiagotomais, tiago, Tiago Sousa Roch, tiagocomerio, tiagocordeiro, tirloni, ttaranto, vanmars, vilmartr, viniciusgoncalves, viniciusllima, voliverio, Wendel Carvalho, wesley.messias, wilson.slima, woyzeck, xa:=zin e 11 visitantes |
|
Você não pode criar novos tópicos neste fórum Você não pode responder tópicos neste fórum Você não pode editar suas mensagens neste fórum Você não pode excluir suas mensagens neste fórum Você não pode enviar anexos neste fórum
|
|