Android gerando exception[RESOLVIDO]

Opa Galera, blz?

Estou com um problema dificil de resolver…

Criei uma app Android 2.3 que rodava blz acessando SQLite. Depois de algumas alterações, começou a dar problema em duas telas.
O problema ocorre com um certo padrao e frequencia qndo o celular está desconectado ( usb <–> eclipse ), e dificilmente ocorre quando está conectado.
É um problema só, mas acontece em 3 telas diferentes, gerando 3 stacktraces diferentes.
Basicamente, eh uma tela (tela 1) com um botao e duas combos, q dependendo da escolha em uma combo, vai abrir com startActivityForResult mais uma tela(tela 2) ou outra(tela 3).
Quando acontece na tela 1: ao clickar no botao para abrir a tela 2 ou 3, a tela trava e depois de alguns segundos o android fala q a app deu erro e vai fecha-la. Também jah travou qndo eu estava apenas rolando um ListView na tela 1.
Quando acontece na tela 2 e 3: pode acontecer após clickar em uma caixa de texto e digitar algo no teclado virtual, ao digitar, trava. Tb pode acontecer ao clickar na caixa de texto, antes do teclado aparecer…
As telas 2 e 3 nao acessam/manipulam a base de dados sql, apenas a tela 1
Antes de travar, consigo abrir as telas 2 e 3 algumas vezes sem problema algum, certa hora, qndo vou abri-la novamente, trava.
Inicialmente imaginei que fosse problema de memoria, mas descartei considerando q qndo está conectado, dificilmente trava. Simplesmente, qndo está conectado, posso abrir as telas 2 e 3 dezenas de vezes e nao apresentar travamento.
Já verifiquei o Manifest algumas vezes tb.

Vou postar um dos stacktraces q consegui recuperar. Quando esse erro ocorreu eu jah estava com a tela 1 aberta( br.com.etica.vendaspocketandroid.view.RecebimentoActivity ) e com dados carregados. O erro ocorreu ao tentar abrir a tela 2 a partir de um botao existente na tela 1. Pelo q entendi, deu problema na tela 1 e o android tentou recria-la, mas como jah houve algum erro no meio, ele nao conseguiu e trouxe o stacktrace da tentativa de reabertura da tela, e nao o q fez a tela dar problema.
Todas as telas herdam de uma BaseActivity que só possui um metodo.

@Override
public void onCreate(Bundle savedInstanceState) {
    
	super.onCreate(savedInstanceState);
	
	Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
        	//Toast.makeText(getApplicationContext(), paramThrowable.getMessage(), Toast.LENGTH_LONG).show();
        	Helper.writeToFile(Log.getStackTraceString(paramThrowable));
            Log.e("Alert Etica",Log.getStackTraceString(paramThrowable));
        }
    });

}

Write to file grava a stacktrace ( abaixo ) em um arquivo externo, jah q eu nao consegui capturar com o Toast.
Já fiz algumas tentativas de encontrar o erro sem sucesso. Portanto, estou aberto a todas as sugestões. Valeu!

java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.etica.vendaspocketandroid/br.com.etica.vendaspocketandroid.view.RecebimentoActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at br.com.etica.vendaspocketandroid.view.RecebimentoActivity.onCreate(RecebimentoActivity.java:46)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
… 11 more

Cara,

Posta essa classe RecebimentoActivity.java ou pelo menos o que tem proximo a linha 46, que é onde esta gerando o erro.
Isso deve ser algum dado nulo, algum componente que vc não inicializou ou um ID de componente errado.

Coisa simples.

Opa…na verdade, dividi as telas em activity e application service. De qualquer forma, vale lembrar q a tela abre e todos os objetos funcionam normalmente, até dar problema.

----------------------------------- Essa é a activity -----------------------------------

package br.com.etica.vendaspocketandroid.view;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import br.com.etica.vendaspocketandroid.R;
import br.com.etica.vendaspocketandroid.R.id;
import br.com.etica.vendaspocketandroid.applicationservice.RecebimentoApplicationService;
import br.com.etica.vendaspocketandroid.helper.BaseActivity;
import br.com.etica.vendaspocketandroid.helper.Helper;

public class RecebimentoActivity extends BaseActivity {

private String[] menuItems = new String[]{"Conectar impressora", "Reimprimir", "Desconectar impressora","Excluir"};
private ListView lsvGrid;
private ListView LSTmenu;

private RecebimentoApplicationService recebimentoApplicationService;

@Override
public void onCreate(Bundle savedInstanceState) {
    try {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_recebimento);

		recebimentoApplicationService = new RecebimentoApplicationService(this);
		
		lsvGrid = (ListView) findViewById(id.lsvGrid);
		LSTmenu = (ListView) findViewById(id.LSTmenu);
		
		LSTmenu.setVisibility(ListView.INVISIBLE);
		
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , menuItems);
		LSTmenu.setAdapter(adapter);
		registerForContextMenu(lsvGrid);
	} catch (Exception e) {
		Toast.makeText(this, e.getCause().toString(),
				Toast.LENGTH_LONG).show();
		
	}

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_recebimento, menu);
    return true;
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
	super.onCreateContextMenu(menu, v, menuInfo);
     
    menu.setHeaderTitle("Opcoes");
    
    for (int i = 0; i<menuItems.length; i++) {
      menu.add(Menu.NONE, i, i, menuItems[i]);
    }
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 

	
    try {
		// Get extra info about list item that was long-pressed
		AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)item.getMenuInfo();
  
		// Perform action according to selected item from context menu
		switch (item.getItemId()) {

		case 0:
			Helper.getInstancia().getImpressaoHelper().conectarImpressora();
		    break;
		case 1:			
			recebimentoApplicationService.imprimirPedido(menuInfo.position);
			break;
		case 2:			
			Helper.getInstancia().getImpressaoHelper().desconectarImpressora();
		    break;		
		case 3:			
			recebimentoApplicationService.excluir(menuInfo.position);
		    break;					    
		}
	} catch (Exception e) {
		Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
	}

    return true; 
} 

@Override
public void onStart(){
	super.onStart();
	
	try {
		recebimentoApplicationService.quandoStartaActivity();
	} catch (Exception e) {
		Toast.makeText(this, e.getCause().toString(),
				Toast.LENGTH_LONG).show();
	}
}

}

----------------------------------- Essa é a application service -----------------------------------

package br.com.etica.vendaspocketandroid.applicationservice;

import java.util.ArrayList;
import java.util.List;

import android.content.Intent;
import android.graphics.Color;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import br.com.etica.vendaspocketandroid.R.id;
import br.com.etica.vendaspocketandroid.adapter.RecebimentoAdapter;
import br.com.etica.vendaspocketandroid.lista.RecebimentoLista;
import br.com.etica.vendaspocketandroid.pojo.Caixa;
import br.com.etica.vendaspocketandroid.service.CaixaService;
import br.com.etica.vendaspocketandroid.view.RecebimentoActivity;
import br.com.etica.vendaspocketandroid.view.RegistrarRecebimentoActivity;

public class RecebimentoApplicationService {

private RecebimentoActivity recebimentoActivity;

private ListView lstItens;
private Button butIncluirRecebimento;
private CaixaService caixaService;
private ArrayList<RecebimentoLista> recebimentoLista;
private RecebimentoAdapter recebimentoAdapter;

public RecebimentoApplicationService(RecebimentoActivity recebimentoActivity) throws Exception {

	this.recebimentoActivity = recebimentoActivity;
	this.lstItens = (ListView) recebimentoActivity.findViewById(id.lsvGrid);
	this.butIncluirRecebimento = (Button) recebimentoActivity
			.findViewById(id.butIncluirRecebimento);


	butIncluirRecebimento.setOnClickListener(butIncluirRecebimentoListener);

	caixaService = new CaixaService();
	
	populaLista();	
}

private View.OnClickListener butIncluirRecebimentoListener = new View.OnClickListener() {
	public void onClick(View v) {
		recebimentoActivity.startActivity(new Intent(recebimentoActivity,
				RegistrarRecebimentoActivity.class));
	}
};

private void populaLista() throws Exception {
	try {
		recebimentoLista = new ArrayList<RecebimentoLista>();
		List<Caixa> lista = (ArrayList<Caixa>) caixaService.listar();

		if ( lista != null){
			for (Caixa caixa : lista) {
				RecebimentoLista rl = new RecebimentoLista();
				rl.setMovimento(caixa.getCxanid());
				rl.setRevendedora(caixa.getPessoa().getPescnome());
				rl.setValor(caixa.getCxanvalor());

				recebimentoLista.add(rl);
			}
		}
		
		recebimentoAdapter = new RecebimentoAdapter(recebimentoActivity,
				recebimentoLista);
		lstItens.setAdapter(recebimentoAdapter);
		lstItens.setCacheColorHint(Color.TRANSPARENT);
		
	} catch (Exception e) {
		Toast.makeText(recebimentoActivity, e.getCause().toString(),
				Toast.LENGTH_LONG).show();
		throw e;
	}
}

public void quandoStartaActivity() throws Exception{
	populaLista();
}

public void imprimirPedido(int position) throws Exception{
	new CaixaService().imprimirRecebimento( ((RecebimentoLista) recebimentoAdapter.getItem(position)).getMovimento() );
}

public void excluir(int position) throws Exception {
	new CaixaService().excluirRecebimento( ((RecebimentoLista) recebimentoAdapter.getItem(position)).getMovimento() );
	populaLista();
}

}

[quote=linux10000]Opa Galera, blz?

Estou com um problema dificil de resolver…

Criei uma app Android 2.3 que rodava blz acessando SQLite. Depois de algumas alterações, começou a dar problema em duas telas.
O problema ocorre com um certo padrao e frequencia qndo o celular está desconectado ( usb <–> eclipse ), e dificilmente ocorre quando está conectado.
É um problema só, mas acontece em 3 telas diferentes, gerando 3 stacktraces diferentes.
Basicamente, eh uma tela (tela 1) com um botao e duas combos, q dependendo da escolha em uma combo, vai abrir com startActivityForResult mais uma tela(tela 2) ou outra(tela 3).
Quando acontece na tela 1: ao clickar no botao para abrir a tela 2 ou 3, a tela trava e depois de alguns segundos o android fala q a app deu erro e vai fecha-la. Também jah travou qndo eu estava apenas rolando um ListView na tela 1.
Quando acontece na tela 2 e 3: pode acontecer após clickar em uma caixa de texto e digitar algo no teclado virtual, ao digitar, trava. Tb pode acontecer ao clickar na caixa de texto, antes do teclado aparecer…
As telas 2 e 3 nao acessam/manipulam a base de dados sql, apenas a tela 1
Antes de travar, consigo abrir as telas 2 e 3 algumas vezes sem problema algum, certa hora, qndo vou abri-la novamente, trava.
Inicialmente imaginei que fosse problema de memoria, mas descartei considerando q qndo está conectado, dificilmente trava. Simplesmente, qndo está conectado, posso abrir as telas 2 e 3 dezenas de vezes e nao apresentar travamento.
Já verifiquei o Manifest algumas vezes tb.

Vou postar um dos stacktraces q consegui recuperar. Quando esse erro ocorreu eu jah estava com a tela 1 aberta( br.com.etica.vendaspocketandroid.view.RecebimentoActivity ) e com dados carregados. O erro ocorreu ao tentar abrir a tela 2 a partir de um botao existente na tela 1. Pelo q entendi, deu problema na tela 1 e o android tentou recria-la, mas como jah houve algum erro no meio, ele nao conseguiu e trouxe o stacktrace da tentativa de reabertura da tela, e nao o q fez a tela dar problema.
Todas as telas herdam de uma BaseActivity que só possui um metodo.

@Override
public void onCreate(Bundle savedInstanceState) {
    
	super.onCreate(savedInstanceState);
	
	Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
        	//Toast.makeText(getApplicationContext(), paramThrowable.getMessage(), Toast.LENGTH_LONG).show();
        	Helper.writeToFile(Log.getStackTraceString(paramThrowable));
            Log.e("Alert Etica",Log.getStackTraceString(paramThrowable));
        }
    });

}

Write to file grava a stacktrace ( abaixo ) em um arquivo externo, jah q eu nao consegui capturar com o Toast.
Já fiz algumas tentativas de encontrar o erro sem sucesso. Portanto, estou aberto a todas as sugestões. Valeu!

java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.etica.vendaspocketandroid/br.com.etica.vendaspocketandroid.view.RecebimentoActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at br.com.etica.vendaspocketandroid.view.RecebimentoActivity.onCreate(RecebimentoActivity.java:46)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
… 11 more
[/quote]

Opa galera, conseguimos resolver o erro aqui.
A solução é tão estranha quanto o problema e seus sintomas.
O que estava gerando o problema era transação aberta por muito tempo (cerca de uns 4 ou 5 minutos ).
A lógica da tela abria a transação na primeira inserção do usuario e soh terminava depois que tudo era digitado e confirmado pelo usuario.
Isso explica pq certa vez estava em uma tela ( com a transacao jah iniciada ) sem utiliza-la, soh olhando pra ela, e simplesmente a tela fechou sozinha e deu a exception.
A solução foi alterar toda a tela para utilizar os dados em memoria ( variaveis globais da tela ) e no metodo de confirmar, checar todas as pendencias, se nao houver nenhuma, grava os dados dessas variaveis no banco e commita ( ou da rollback, caso haja problema ).
Na verdade, deveriamos ter feito assim desde o começo, por algum motivo nos distraimos e demos esse vacilo.
De qualquer forma, muito obrigado por quem leu e tentou ajudar aqui.
Valeu.