Eu estou usando o Palm Os Emulator, e fiz uma aplicação de cadastro de clientes e produtos, utilizando RecordStore, RecordEnumeration, RecordFilter etc, acontece que a partir do momento que eu começo a inserir mais que 20 registros no RecordStore a aplicação começa a ficar lenta… isso só acontece no emulador, no palm vai lento igual? e existe alguma forma de minimizar isso?
Palm lento
11 Respostas
O problema de lentidão é principalmente agravado quando se usa uma enumeration que foi construída usando-se um RecordEnumeration/RecordFilter.
Você quando implementa uma destas duas interfaces (ou as duas), tem que ter em mente que como elas vão ser chamadas muitas vezes, o tempo gasto dentro do corpo do método tem que ser mínimo.
Reveja seu código nestas classes e tente cortar ou otimizar o que for possível. Uma mudança na abordagem utilizada para fazer as comparações e/ou sorts também ajuda.
O problema de lentidão é principalmente agravado quando se usa uma enumeration que foi construída usando-se um RecordEnumeration/RecordFilter.Você quando implementa uma destas duas interfaces (ou as duas), tem que ter em mente que como elas vão ser chamadas muitas vezes, o tempo gasto dentro do corpo do método tem que ser mínimo.
Reveja seu código nestas classes e tente cortar ou otimizar o que for possível. Uma mudança na abordagem utilizada para fazer as comparações e/ou sorts também ajuda.
Mas ao meu ver o código já está enxutíssimo, eu posso postar os códigos das interfaces pra vcs olharem e talvez otimizarem ele?
Pode.
class Enumera implements RecordComparator
{
public int compare(byte[] rec1, byte[] rec2)
{
String str1 = new String(rec1), str2 = new String(rec2);
//O formato dos produtos ou clientes é codigo;nome... por isso o substring
// para que a ordenação seja feita pelo nome, não pelo código
str1 = str1.substring(2);
str2 = str2.substring(2);
int result = str1.compareTo(str2);
if (result == 0)
return RecordComparator.EQUIVALENT;
else if (result < 0)
return RecordComparator.PRECEDES;
else
return RecordComparator.FOLLOWS;
}
}
class Filtro implements RecordFilter
{
private String searchText = null;
public Filtro(String txt)
{
this.searchText = txt;
}
public boolean matches(byte[] candidate)
{
String str = new String(candidate).toLowerCase();
//Procura
if (searchText != null && str.indexOf(searchText) != -1)
return true;
else
return false;
}
}
Por quê já não construir as String com o conteúdo desejado para a comparação ? Isto evita criação desnecessária de objetos.Faça assim:
str1 = new String(rec1,2,10);
str2 = new String(rec2,2,10);
Você pode construir o objeto Filtro sem ter o pattern de busca ? Faz sentido ?
A comparação também poderia ser feita de outra forma…
Por quê já não construir as String com o conteúdo desejado para a comparação ? Isto evita criação desnecessária de objetos.Faça assim:str1 = new String(rec1,2,10); str2 = new String(rec2,2,10);Você pode construir o objeto Filtro sem ter o pattern de busca ? Faz sentido ?
A comparação também poderia ser feita de outra forma…
Não entendi quando vc falou…
Você pode construir o objeto Filtro sem ter o pattern de busca? Faz sentido?
E tem outra, o tamanho da String nem sempre vai ser 10
Eu coloquei de tamanho 10 pois não sei qual o tamanho da string de comparação no seu RecordComparator, ok ?!
Quando ao RecordFilter é o seguinte:
Dentro do match, acho que esta comparação que para saber se searchtext é diferente de null, não faz sentido, pois vc sempre quando construir o filtro, vai passar algo para o contrutor do objeto, certo ?
Ex:
Filtro filtro = new Filtro(“Alex”);
Portanto, a comparação deve ser retirada do código pois não lhe ajuda em nada.
Aham, isso turdo que vc falou está certo e eu já fiz as alterações necessárias, mas mesmo assim isso não vai causar impacto na performance… outra coisinha, é melhor eu ter somente algns commands em váriosforms, e na hora do evento eu vejo em qual form está para tomar a decisão apropriada, usando um display.getCurrent(), ou crio um command diferente para cada form?
A primeira abordagem referente ao uso de Commands, parece ser a melhor, já que gasta menos memória e você usa o conceito de reutilização.
O que dita se vc usa a primeira ou a segunda abordagem é como sua aplicação foi construída.
Por exemplo, tenho uma midlet onde cada tela ocupa um .java, e tenho 1 Command “Voltar” em cada classe que representa cada tela.
Gasto mais memória, mas tenho o código de cada tela bem separado, e a manutenção tá mais fácil. Hoje eu não consigo usar a primeira abordagem que te sugeri, pois do jeito que aplicação está, seria custoso mudar tudo.
Então do jeito que eu fiz, acho que a primeira abordagem é melhor, porque eu não estou usando classes separadas para cada form… talvez depois eu até separe o código em classes