Ola pessoal, meu problema é o seguinte estou desenvolvendo um joguinho para dispositivo móvel e sabemos que eles não possuem uma memoria muito grande, então imaginei o seguinte, criar uma tela de loading que teria a finalidade de remover as referencias e avisar ao coletor de lixo que se ele quiser ou for necessário pode limpar o lixinho usando o System.gc();.
O problema é o seguinte não posso tirar as referencias na classe game, vou explicar o porque, ele implementa a seguinte interface :
EnginerOption();
LoadResource();
CreateScene();
EnginerLoop();
Quando chega em CreateScene(); ela cria uma cena para por imagens então crio um objeto preload que por default no construtor ja cria como primeira cena o Menu. Até ai tudo bem, mas chegou o meu problema, se a pessoa clicar em Iniciar Game ela ira criar outro objeto (CarregarMapa) que carregara o mapa e inicia o jogo, logo o menu se torna inútil, pois já estamos em outra cena. Então eu queria deslocar recurso, mas na internet não encontrei nada que torne o objeto Menu um lixo para o coletor a não ser que aponte para NULL. Se eu fizer:
Menu menu = new Menu();
menu = null;
'-' vai criar e ja vai " perder a referencia e não é isso que queremos, preciso que o menu avise ou saiba quando ele se tornou inútil. O melhor jeito que encontrei foi esse colocar um metodo finalizar em todas as classes que serão limpadas
Programa testepublic class MyTeste {
public boolean finalizar(boolean op){
return op;
}
}
E uma bela de uma gambiarra onde uma classe Object recebe um objeto genérico, copia os métodos da mesma e verifica se esta retornando true ou false se for true então retira a referencia do objeto, essa verificação irá ficar em um loop infinito que é o mesmo loop do GameEnginer;
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// TODO Auto-generated method stub
myTeste = new MyTeste();
teste(myTeste);
}
public static void teste(Object op) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class cls = op.getClass();
Method metodo = cls.getMethod("finalizar", boolean.class);
o = new Object();
arg = new Boolean(false);
o = metodo.invoke(myTeste, arg);
System.out.print(o);
}
Minha pergunta é tem uma maneira mais facil de dizer Menu você é lixo dentro do próprio menu? Ou outra maneira de setar NULL no menu?
Ja tentei o seguinte e não funcionou :public void removerReferencia(Object o){
o = null;
[img]http://img208.imageshack.us/img208/7371/classdiagram1.jpg[/img]
ele resolveu bem a xaradinha