Android
Excepciones
Buscar..
NetworkOnMainThreadException
De la documentación :
La excepción que se produce cuando una aplicación intenta realizar una operación de red en su hilo principal.
Esto solo se lanza para aplicaciones dirigidas al Honeycomb SDK o superior. Las aplicaciones que apuntan a versiones anteriores del SDK pueden hacer redes en sus subprocesos de bucle de eventos principales, pero no se recomienda.
Aquí hay un ejemplo de un fragmento de código que puede causar esa excepción:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri.Builder builder = new Uri.Builder().scheme("http").authority("www.google.com");
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
URL url;
try {
url = new URL(builder.build().toString());
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
} catch (IOException e) {
Log.e("TAG","Connection error", e);
} finally{
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e("TAG", "Error closing stream", e);
}
}
}
}
}
El código anterior lanzará la NetworkOnMainThreadException
para aplicaciones dirigidas a Honeycomb SDK (Android v3.0) o superior, ya que la aplicación está intentando realizar una operación de red en el hilo principal.
Para evitar esta excepción, sus operaciones de red siempre deben ejecutarse en una tarea en segundo plano a través de una AsyncTask
, Thread
, IntentService
, etc.
private class MyAsyncTask extends AsyncTask<String, Integer, Void> {
@Override
protected Void doInBackground(String[] params) {
Uri.Builder builder = new Uri.Builder().scheme("http").authority("www.google.com");
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
URL url;
try {
url = new URL(builder.build().toString());
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
} catch (IOException e) {
Log.e("TAG","Connection error", e);
} finally{
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e("TAG", "Error closing stream", e);
}
}
}
return null;
}
}
ActivityNotFoundException
Esta es una Exception
muy común. Hace que la aplicación se detenga durante el inicio o la ejecución de la aplicación. En el LogCat
ves el mensaje:
android.content.ActivityNotFoundException : Unable to find explicit activity class;
have you declared this activity in your AndroidManifest.xml?
En este caso, verifique si ha declarado su actividad en el archivo AndroidManifest.xml
.
La forma más sencilla de declarar su Activity
en AndroidManifest.xml
es:
<activity android:name="com.yourdomain.YourStoppedActivity" />
Error de memoria insuficiente
Este es un error de tiempo de ejecución que ocurre cuando solicita una gran cantidad de memoria en el montón. Esto es común cuando se carga un mapa de bits en un ImageView.
Tienes algunas opciones:
- Utilice un montón de aplicaciones grandes
Agregue la opción "largeHeap" a la etiqueta de la aplicación en su AndroidManifest.xml. Esto hará que haya más memoria disponible para su aplicación, pero es probable que no solucione el problema de raíz.
<application largeHeap="true" ... >
- Recicla tus bitmaps
Después de cargar un mapa de bits, asegúrese de reciclarlo y liberar memoria:
if (bitmap != null && !bitmap.isRecycled())
bitmap.recycle();
- Cargar bitmaps muestreados en memoria
Evite cargar todo el mapa de bits en la memoria al mismo tiempo muestreando un tamaño reducido, utilizando BitmapOptions e inSampleSize.
Ver la documentación de Android por ejemplo
DexException
com.android.dex.DexException: Multiple dex files define Lcom/example/lib/Class;
Este error se produce porque la aplicación, al empaquetar, encuentra dos archivos .dex
que definen el mismo conjunto de métodos.
Por lo general, esto sucede porque la aplicación ha adquirido accidentalmente 2 dependencias separadas en la misma biblioteca.
Por ejemplo, supongamos que tiene un proyecto y desea confiar en dos bibliotecas: A
y B
, cada una con sus propias dependencias. Si la biblioteca B
ya tiene una dependencia de la biblioteca A
, se lanzará este error si la biblioteca A
se agrega al proyecto por sí misma. La compilación de la biblioteca B
ya proporcionó el conjunto de códigos de A
, de modo que cuando el compilador va a la biblioteca de paquetes A
, encuentra los métodos de la biblioteca A
ya empaquetados.
Para resolverlo, asegúrese de que ninguna de sus dependencias se pueda agregar accidentalmente dos veces de esa manera
UncaughtException
Si desea manejar excepciones no detectadas, intente capturarlas todas en el método onCreate de su clase de aplicación:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
try {
Thread
.setDefaultUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable e) {
Log.e(TAG,
"Uncaught Exception thread: "+thread.getName()+"
"+e.getStackTrace());
handleUncaughtException (thread, e);
}
});
} catch (SecurityException e) {
Log.e(TAG,
"Could not set the Default Uncaught Exception Handler:"
+e.getStackTrace());
}
}
private void handleUncaughtException (Thread thread, Throwable e){
Log.e(TAG, "uncaughtException:");
e.printStackTrace();
}
}
Registro de manejador propio para excepciones inesperadas.
Así es como puede reaccionar a las excepciones que no se han detectado, de forma similar al estándar del sistema "La aplicación XYZ se ha bloqueado"
import android.app.Application;
import android.util.Log;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* Application class writing unexpected exceptions to a crash file before crashing.
*/
public class MyApplication extends Application {
private static final String TAG = "ExceptionHandler";
@Override
public void onCreate() {
super.onCreate();
// Setup handler for uncaught exceptions.
final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable e) {
try {
handleUncaughtException(e);
System.exit(1);
} catch (Throwable e2) {
Log.e(TAG, "Exception in custom exception handler", e2);
defaultHandler.uncaughtException(thread, e);
}
}
});
}
private void handleUncaughtException(Throwable e) throws IOException {
Log.e(TAG, "Uncaught exception logged to local file", e);
// Create a new unique file
final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.US);
String timestamp;
File file = null;
while (file == null || file.exists()) {
timestamp = dateFormat.format(new Date());
file = new File(getFilesDir(), "crashLog_" + timestamp + ".txt");
}
Log.i(TAG, "Trying to create log file " + file.getPath());
file.createNewFile();
// Write the stacktrace to the file
FileWriter writer = null;
try {
writer = new FileWriter(file, true);
for (StackTraceElement element : e.getStackTrace()) {
writer.write(element.toString());
}
} finally {
if (writer != null) writer.close();
}
// You can (and probably should) also display a dialog to notify the user
}
}
Luego registre esta clase de aplicación en su AndroidManifest.xml:
<application android:name="de.ioxp.arkmobile.MyApplication" >