CustomItem lento e falhando em alguns celulares

Amigos,

Criei este customitem que serve para buscar um codigo da cidade em arquivos por streams mas em alguns celulares fica muito lento e em outros a tela trava e não navega.

Abaixo meu código. me perdoem pois estou aprendendo customitem agora.

import javax.microedition.lcdui.CustomItem;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import java.util.Vector;
import javax.microedition.lcdui.Canvas;
import java.io.InputStreamReader;

public class KnCiCidadesBox extends CustomItem{
			
	/**Largura do campo*/
	private int largura;

	/**Altura do campo*/
	private int altura;
	
	private Font fonte;
	
	/**Valor do código*/
	private String vlCodigo;
	
	/**Valor do campo estado*/
	private String vlEstado;

	/**Valor do campo cidade
	 * Tamanho Max 27
	 **/
	private String vlCidade;
	
	/**Posicao selecionada*/
	private int posSelecao;

	/**Estado selecionado*/
	private int posEstado;
	
	/**Cidade selecionado*/
	private int posCidade;

	/**Vetor de Estados*/
	private Vector listaestados;
	
	/**Vetor de Cidades*/
	private Vector listacidades;

	/**Vetor de Cidades*/
	private Vector listacodcidades;

	/**Estado Selecionado*/
	private String valorEstado;
	
	public KnCiCidadesBox (String Titulo, int _largura){
		super(Titulo);
		super.setLayout (CustomItem.LAYOUT_EXPAND);
		setLayout (CustomItem.LAYOUT_EXPAND);
		
		fonte = Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_PLAIN,Font.SIZE_MEDIUM);
		largura = _largura;
		altura = (fonte.getHeight () * 3);
		
		vlCodigo = "";
		vlEstado = "UF";
		vlCidade = "CIDADE";

		posSelecao = -1;
		posEstado = 0;
		posCidade = 0;

		listaestados = new Vector();
		listacidades = new Vector();
		listacodcidades = new Vector();
		valorEstado = "";
		new Thread(){
			public void run(){
				carregarEstados();
			}
		}.start();
		repaint ();
		
	}
			
	/**Metodo usado pela KVM*/
	protected int getMinContentHeight() {return altura;}

	/**Metodo usado pela KVM*/
	protected int getMinContentWidth() {return largura;}

	/**Metodo usado pela KVM*/
	protected int getPrefContentHeight(int _i) {return altura;}

	/**Metodo usado pela KVM*/
	protected int getPrefContentWidth(int _i) {return largura;}
				
	/**Metodo usado pela KVM*/
    protected void keyPressed(int _keyCode){  	
		if (vlCidade.length ()>=7){
			if (vlCidade.substring (0,7).equals ("AGUARDE"))
				return;
		}
						
		if (vlCidade.length ()>=8){
			if (vlCidade.substring (0,8).equals ("BUSCANDO"))
				return;
		}
		
		if (posSelecao == 0){
	
				if (_keyCode == Canvas.FIRE){
					new Thread(){
						public void run(){
							buscaCidade ();
						}
					}.start();
					
				}else if ((_keyCode == Canvas.KEY_STAR)
				|| (_keyCode == -8)
				|| (_keyCode == 8)){
						
					int tamanho = vlCodigo.length ();
					if (tamanho>1){
						tamanho --;
						if ((tamanho == 3)
							|| (tamanho == 6)){
								tamanho --;
							}
						vlCodigo = vlCodigo.substring (0,tamanho);
					}else{
						vlCodigo = "";
					}
					
				}else if (vlCodigo.length ()<=6){
					if (_keyCode == Canvas.KEY_NUM0){
							vlCodigo += "0";
		
					}else if (_keyCode == Canvas.KEY_NUM1){
						vlCodigo += "1";
		
					}else if (_keyCode == Canvas.KEY_NUM2){
						vlCodigo += "2";
		
					}else if (_keyCode == Canvas.KEY_NUM3){
						vlCodigo += "3";
		
					}else if (_keyCode == Canvas.KEY_NUM4){
						vlCodigo += "4";
		
					}else if (_keyCode == Canvas.KEY_NUM5){
						vlCodigo += "5";
		
					}else if (_keyCode == Canvas.KEY_NUM6){
						vlCodigo += "6";
						
					}else if (_keyCode == Canvas.KEY_NUM7){
						vlCodigo += "7";
		
					}else if (_keyCode == Canvas.KEY_NUM8){
						vlCodigo += "8";
		
					}else if (_keyCode == Canvas.KEY_NUM9){
						vlCodigo += "9";
					}
				}
				vlEstado = "UF";
				vlCidade = "CIDADE";
				invalidate ();
				repaint ();		
		}		
    }	

	/**Metodo usado pela KVM*/
	protected boolean traverse(int _dir, int _viewportWidth, int _viewportHeight, int[] _visRect_inout){
			
		if (vlCidade.length ()>=7)
			if (vlCidade.substring (0,7).equals ("AGUARDE"))
				return false;
					
		else if (vlCidade.length ()>=8)
			if (vlCidade.substring (0,8).equals ("BUSCANDO"))
				return false;

		if (_dir == Canvas.UP){
			return posSelecao (-1);		
	
		}else if (_dir == Canvas.DOWN){
			return posSelecao (1);
			
		}else{
			if (_dir == Canvas.LEFT){
				if (posSelecao == 1){
					posEstado (-1);	
				}else if (posSelecao == 2){
					posCidade(-1);
				}
			}else if (_dir == Canvas.RIGHT){
				if (posSelecao == 1){
					posEstado (1);	
				}else if (posSelecao == 2){
					posCidade(1);
				}			
			}
			return true;
		}
	}

	/**Metodo usado pela KVM*/
	protected void paint(Graphics _tela, int _largura, int _altura) {
		
		_tela.setFont (fonte);
		_tela.setColor (255,255,255);
		_tela.fillRect (0,0,largura,altura);
		
		desenhaCampoCodigo(_tela);
		desenhaCampoEstado(_tela);
		desenhaCampoCidade(_tela);
		
		
		//_tela.drawLine ((largura/2),0,(largura/2),(altura/2));
		//_tela.drawLine (0,(altura/2),(largura-9) ,(altura/2));
		//_tela.drawRect (0,0,(largura-9),(altura-1));
		
		
	}

	private void desenhaCampoCodigo(Graphics _tela){					
		int alt = fonte.getHeight ();
		int y = (altura/4) - (alt/2);
		int lar = ((largura/2)-20);
		int x = ((largura/4)-(lar/2));

		_tela.setColor (0,0,0);
		
		//Desenha Texto
		if (!vlCodigo.equals ("")){
			while (_tela.getFont ().stringWidth (vlCodigo)>lar){
				vlCodigo = vlCodigo.substring (0,vlCodigo.length ()-2);	
			}
			_tela.drawString (vlCodigo, (x + ((lar/2)-(fonte.stringWidth (vlCodigo)/2))),y, Graphics.TOP|Graphics.LEFT ); 		
		}
		
		//Desenha Borda
		_tela.drawRect (x,y,lar,alt);
		
		//Desenha Seleção
		if (posSelecao == 0)
			_tela.drawRect (x-2,y-2,lar+4,alt+4); 
		

	}

	private void desenhaCampoEstado(Graphics _tela){

		int alt = fonte.getHeight ();
		int y = ((altura/4) - (alt/2));
		int lar = ((largura/2)-40);
		int x = (((largura-9)/2) + ((largura/4)-(lar/2)));

		_tela.setColor (0,0,0);
		
		if ((vlEstado.equals ("UF"))
		|| (vlEstado.equals ("--")))
			_tela.setColor (0,0,255);


		//Desenha Texto
		if (!vlEstado.equals ("")){
			while (_tela.getFont ().stringWidth (vlEstado)>lar){
				vlEstado = vlEstado.substring (0,vlEstado.length ()-2);	
			}
			_tela.drawString (vlEstado, (x + ((lar/2)-(fonte.stringWidth (vlEstado)/2))),y, Graphics.TOP|Graphics.LEFT ); 		
		}
		
		_tela.setColor (0,0,0);
		
		//Desenha Borda
		_tela.drawRect (x,y,lar,alt);
	
		//Desenha Seleção
		if (posSelecao == 1)
			_tela.drawRect (x-2,y-2,lar+4,alt+4); 

		//Seta de Voltar	
		_tela.fillTriangle ( (x - 10), (y + (alt/2)), 
							 (x - 3) ,y,
							 (x - 3) ,(y + alt));
				
		//Seta de Avançar			  
		_tela.fillTriangle ( ((x + lar) + 10), (y + (alt/2)), 
							 ((x + lar) + 4) ,y,
							 ((x + lar) + 4) ,(y + alt));

	}

	private void desenhaCampoCidade(Graphics _tela){
		int alt = fonte.getHeight ();
		int y = (((altura-1)/2) + ((altura/4) - (alt/2)));
		
		int lar = largura-40;
		int x = (((largura-9)/2)-(lar/2));

		_tela.setColor (0,0,0);

		try{
			if (vlCidade.equals ("CIDADE"))
				_tela.setColor (0,0,255);
			
			else if (vlCidade.length ()>=7)
				if (vlCidade.substring (0,7).equals ("AGUARDE"))
					_tela.setColor (0,0,255);
					
			else if (vlCidade.length ()>=8)
				if (vlCidade.substring (0,8).equals ("BUSCANDO"))
					_tela.setColor (0,0,255);

			else if (vlCidade.length()>=15)
				if (vlCidade.substring (0,15).equals ("NÃO ENCONTRADO!"))
					_tela.setColor (0,0,255);


		}catch (Exception eC){
			eC.printStackTrace ();
		}
		
		//Desenha Texto
		if (!vlCidade.equals ("")){
			int comprimento;
			do{
				comprimento = _tela.getFont().stringWidth (vlCidade);
				if (comprimento>=lar){
					if (_tela.getFont().getSize () == Font.SIZE_SMALL){
						vlCidade = vlCidade.substring (0,vlCidade.length ()-2);
						vlCidade += ".";
					}else {
						_tela.setFont (Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_PLAIN,Font.SIZE_SMALL));
					}
				}
			}while (comprimento >= lar);
			
			_tela.drawString (vlCidade,
							 ( (x + (lar/2)) - (_tela.getFont ().stringWidth (vlCidade)/2)),
							 (((altura-1)/2) + ((altura/4) - (_tela.getFont ().getHeight ()/2))),
							  Graphics.TOP|Graphics.LEFT ); 		
			
			_tela.setFont (fonte);
		}

		_tela.setColor (0,0,0);


		//Desenha Borda
		_tela.drawRect (x,y,lar,alt); 
		
		//Desenha Seleção
		if (posSelecao == 2)
			_tela.drawRect (x-2,y-2,lar+4,alt+4); 

		//Seta de Voltar	
		_tela.fillTriangle ( (x - 10), (y + (alt/2)), 
							 (x - 3) ,y,
							 (x - 3) ,(y + alt));
				
		//Seta de Avançar			  
		_tela.fillTriangle ( ((x + lar) + 10), (y + (alt/2)), 
							 ((x + lar) + 4) ,y,
							 ((x + lar) + 4) ,(y + alt));						 			


	}

	private boolean posSelecao(int _valor){
		posSelecao += _valor;
		
		if ((posSelecao == 1)
		&& (vlCodigo.length ()>0)
		&& (vlEstado.equals ("UF"))){
						
			new Thread(){
				public void run(){
					buscaCidade ();
				}
			}.start();
			return false;
			
		}else if ((posSelecao == 2)
			&& (!valorEstado.equals (vlEstado)) && (!vlEstado.equals ("UF"))){
				
				new Thread(){
					public void run(){
						carregarCidade (true);
					}
				}.start();
					return true;
			
		}else {		

			if (posSelecao < 0){
					return false;
					
			}else if (posSelecao > 2){
					return false;
					
			}else {
				repaint ();
				return true;
				
			}
			
		}
	}
		
	private void posEstado(int _valor){
		if (listaestados.size () > 0){
			posEstado += _valor;
			
			if (posEstado >= listaestados.size ()){
				posEstado = 0;
			}
			
			if (posEstado < 0){
				posEstado = listaestados.size ()-1;
			}
						
			vlEstado = (String) listaestados.elementAt (posEstado);
			vlCodigo = "";
			vlCidade = "CIDADE";
			valorEstado = "";
			repaint ();
		}		
	}

	private void posCidade(int _valor){
		if (listacidades.size () > 0){
			posCidade += _valor;
			
			if (posCidade >= listacidades.size ()){
				posCidade = 0;
			}
			
			if (posCidade < 0){
				posCidade = listacidades.size ()-1;
			}
						
			vlCidade = (String) listacidades.elementAt (posCidade);
			vlCodigo = (String) listacodcidades.elementAt (posCidade);
			repaint ();
		}
	}


	private void carregarEstados(){
		vlEstado = "Aguarde...";
		repaint ();	
		listaestados = new Vector();
		
		String Texto = "";  
		InputStreamReader iSR = null;
		
		try{
			iSR = new InputStreamReader(getClass().getResourceAsStream("/KnCiCidadesBox/Estados.kccb"));
			int ch;
			while((ch = iSR.read())>-1){
				if (ch == 34){
					if (!Texto.trim ().equals ("")){
						listaestados.addElement (Texto);
						Texto = "";
					}
				}else{
					if ((ch != 13) && (ch!=10))
						Texto +=  (char)ch;
				}
			}
			vlEstado = "UF";
		}catch(Exception e){
			vlEstado = "N/D";
			listaestados = new Vector();
			e.printStackTrace ();
		}
		repaint ();
	}


	private void carregarCidade(boolean _exibe){
		if (_exibe){
			vlCidade = "AGUARDE...";
			repaint ();	
		}
		listacidades = new Vector();
		listacodcidades = new Vector();

		String Codigo = "";
		String Texto = "";  
		InputStreamReader iSR = null;
		
		try{
			iSR = new InputStreamReader(getClass().getResourceAsStream("/KnCiCidadesBox/" + String.valueOf (listaestados.elementAt (posEstado)) +".kccb"));
			int ch;
			while((ch = iSR.read())>-1){
				if (ch == 34){
					if ((!Texto.trim ().equals (""))
					&& (!Texto.trim ().equals (";"))) {
						if (Codigo.equals ("")){
							while (Texto.charAt (Texto.length ()-1) == '0')
								Texto = Texto.substring (0,Texto.length ()-1);
							Codigo = Texto;
						}else{
							listacidades.addElement (Texto);
							listacodcidades.addElement (Codigo);
							Codigo = "";
						}
						Texto = "";
					}
				}else{
					if ((ch != 13) && (ch!=10) && (ch!=44) && (ch!=59))
						Texto +=  (char)ch;
				}
			}
			if (_exibe){
				vlCidade = (String)listacidades.elementAt (0);
				vlCodigo = (String) listacodcidades.elementAt (0);
				valorEstado = vlEstado;
			}
		
		}catch(Exception e){
			if (_exibe){
				vlCidade = "N/D";
			}
			listacidades = new Vector();
			listacodcidades = new Vector();
			e.printStackTrace ();
		
		}
		if (_exibe){
			repaint ();
		}
	}
	
	private static String ajustaTamanho(String _texto, int _tamanho){
		while(_texto.length()<_tamanho){
			_texto += " ";
		}
		
		if(_texto.length()>_tamanho){
			_texto = _texto.substring(0, _tamanho);
		}
		return _texto;
	}

	private void buscaCidade(){
		try{
			int Cont = 0;
			vlEstado = "--";
			vlCidade = "BUSCANDO";
	
			posEstado = 0;
			
			int tCod = -1;
			int tvlCodigo = Integer.parseInt (vlCodigo);
					
			while ((posEstado < listaestados.size ()) 
			&& (vlCidade.substring(0,8).equals ("BUSCANDO"))){
				if (vlCidade.trim().length ()<11){
					vlCidade = vlCidade.trim() + ".";
				}else{
					vlCidade = "BUSCANDO";
				}
				vlCidade = ajustaTamanho (vlCidade,11);
				repaint ();
				
				posCidade = 0;
				carregarCidade (false);				
				while ((posCidade < listacodcidades.size ()) 
					&& (vlCidade.substring(0,8).equals ("BUSCANDO"))){
					tCod =  Integer.parseInt ((String)listacodcidades.elementAt (posCidade));
					if (tCod == tvlCodigo){
						vlCidade = ajustaTamanho ((String) listacidades.elementAt (posCidade),8);
						vlEstado = (String) listaestados.elementAt (posEstado);
						valorEstado = vlEstado;
					}
					posCidade++;					
				}
				posEstado++;
			}
			
		}catch (Exception e){
			BuscanaoEncontrada ();
			e.printStackTrace ();
		}

		if (vlCidade.substring(0,8).equals ("BUSCANDO")){
			BuscanaoEncontrada ();
		}
		
		repaint ();

	}
	
	private void BuscanaoEncontrada(){
		vlCodigo = "";
		vlEstado = "--";
		vlCidade = "NÃO ENCONTRADO!";
		posEstado = 0;
		posCidade = 0;
		repaint ();
		try{
			Thread.sleep (2000);
		}catch (Exception e){
			e.printStackTrace ();
		}
		vlEstado = "UF";
		vlCidade = "CIDADE";
		
	}
	
	protected void pointerPressed(int _x, int _y){
		int alt = fonte.getHeight ();
		int y = ((altura/4) - (alt/2));
		int lar = ((largura/2)-40);
		int x = (((largura-9)/2) + ((largura/4)-(lar/2)));
				
		if ((_x > (x-10)) && (_x < x) && (_y > (y - (alt/2))) && (_y < (y + alt))) {		
			posEstado (-1);
		}else if ((_x > ((x + lar)-10)) && (_x > (x + lar)) && (_y >(y - (alt/2))) && (_y < (y + alt))){
			posEstado (1);
		}

		alt = fonte.getHeight ();
		y = (((altura-1)/2) + ((altura/4) - (alt/2)));
		
		lar = largura-40;
		x = (((largura-9)/2)-(lar/2));

		if ((_x > (x-10)) && (_x < x) && (_y > (y - (alt/2))) && (_y < (y + alt))) {		
			
			if ((!valorEstado.equals (vlEstado)) && (!vlEstado.equals ("UF"))){		
				new Thread(){
					public void run(){
						carregarCidade (true);
					}
				}.start();
			}
						
			posCidade (-1);
		}else if ((_x > ((x + lar)-10)) && (_x > (x + lar)) && (_y >(y - (alt/2))) && (_y < (y + alt))){

			if ((!valorEstado.equals (vlEstado)) && (!vlEstado.equals ("UF"))){		
				new Thread(){
					public void run(){
						carregarCidade (true);
					}
				}.start();
			}

			posCidade (1);
		}
	}
}

Agradeço a atenção.