Sök…


NetworkOnMainThreadException

Från dokumentationen :

Undantaget som kastas när en applikation försöker utföra en nätverksoperation på huvudtråden.

Detta kastas bara för applikationer som är inriktade på Honeycomb SDK eller högre. Program som är inriktade på tidigare SDK-versioner tillåter nätverksarbete på sina trådar med huvudhändelsslingor, men det är starkt avskräckt.

Här är ett exempel på ett kodfragment som kan orsaka det undantaget:

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);
                }
            }
        }
    }
}  

Ovanstående kod kommer att kasta NetworkOnMainThreadException för applikationer som är inriktade på Honeycomb SDK (Android v3.0) eller högre eftersom applikationen försöker utföra en nätverksoperation på huvudtråden.

För att undvika detta undantag måste dina nätverksoperationer alltid köras i en bakgrundsuppgift via en 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

Detta är ett mycket vanligt Exception . Det får din ansökan att stanna under starten eller körningen av din app. I LogCat ser du meddelandet:

android.content.ActivityNotFoundException : Unable to find explicit activity class; 
have you declared this activity in your AndroidManifest.xml?

Kontrollera i så fall om du har deklarerat din aktivitet i filen AndroidManifest.xml .

Det enklaste sättet att förklara din Activity i AndroidManifest.xml är:

<activity  android:name="com.yourdomain.YourStoppedActivity" />           

OutOfMemoryError

Detta är ett runtime-fel som händer när du begär en stor mängd minne på högen. Detta är vanligt när du laddar en bitmapp i en ImageView.

Du har några alternativ:

  1. Använd en stor applikationshög

Lägg till "largeHeap" -alternativet till applikationstaggen i din AndroidManifest.xml. Detta kommer att göra mer minne tillgängligt för din app men kommer sannolikt inte att lösa rotproblemet.

<application largeHeap="true" ... >
  1. Återvinn dina bitmappar

Efter att ha laddat en bitmapp, se till att återvinna den och frigöra minne:

    if (bitmap != null && !bitmap.isRecycled())
       bitmap.recycle();
  1. Ladda samplade bitmappar i minnet

Undvik att ladda hela bitmappen i minnet på en gång genom att ta prov på en reducerad storlek med BitmapOptions och inSampleSize.

Se till exempel Android-dokumentation

DexException

com.android.dex.DexException: Multiple dex files define Lcom/example/lib/Class;

Detta fel inträffar eftersom appen, vid förpackning, hittar två .dex filer som definierar samma uppsättning metoder.

Vanligtvis händer detta eftersom appen av misstag har förvärvat två separata beroenden på samma bibliotek.

Säg till exempel att du har ett projekt och att du vill lita på två bibliotek: A och B , som alla har sina egna beroenden. Om bibliotek B redan har ett beroende av bibliotek A kastas detta fel om bibliotek A läggs till i projektet av sig själv. Att sammanställa bibliotek B gav redan uppsättningen kod från A , så när kompilatorn går till paketbibliotek A , hittar den bibliotek A : s metoder som redan är paketerade.


För att lösa, se till att inget av dina beroenden av misstag kunde läggas till två gånger på ett sådant sätt

UncaughtException

Om du vill hantera obefläckade undantag, försök att fånga dem alla på onCreate-metoden för din applikationsklass:

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();
    }
}

Registrera egen hanterare för oväntade undantag

Så här kan du reagera på undantag som inte har fångats, liknande systemets standard "Application XYZ has crashed"

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
    }
}

Registrera sedan den här applikationsklassen i din AndroidManifest.xml:

<application android:name="de.ioxp.arkmobile.MyApplication" >


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow