Поиск…


NetworkOnMainThreadException

Из документации :

Исключение, которое возникает, когда приложение пытается выполнить сетевую операцию в своем основном потоке.

Это делается только для приложений, ориентированных на SDK Honeycomb или выше. Приложениям, ориентированным на более ранние версии SDK, разрешено создавать сети по своим основным потокам цикла событий, но это сильно обескураживает.

Вот пример фрагмента кода, который может вызвать это исключение:

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

Над кодом будет NetworkOnMainThreadException для приложений, ориентированных на Honeycomb SDK (Android v3.0) или выше, поскольку приложение пытается выполнить сетевую операцию в основном потоке.

Чтобы избежать этого исключения, ваши сетевые операции всегда должны выполняться в фоновом задании через AsyncTask , Thread , IntentService и т. Д.

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

Это очень распространенное Exception . Это заставляет ваше приложение останавливаться во время запуска или выполнения вашего приложения. В LogCat вы увидите сообщение:

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

В этом случае проверьте, заявили ли вы свою активность в файле AndroidManifest.xml .

Самый простой способ объявить свою Activity в AndroidManifest.xml :

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

OutOfMemoryError

Это ошибка времени выполнения, которая возникает, когда вы запрашиваете большой объем памяти в куче. Это часто встречается при загрузке Bitmap в ImageView.

У вас есть несколько вариантов:

  1. Используйте большую кучу приложений

Добавьте параметр «largeHeap» в тег приложения в вашем AndroidManifest.xml. Это сделает больше памяти доступной для вашего приложения, но, скорее всего, не устранит проблему с корнем.

<application largeHeap="true" ... >
  1. Переработайте растровые изображения

После загрузки растрового изображения обязательно переработайте его и освободите память:

    if (bitmap != null && !bitmap.isRecycled())
       bitmap.recycle();
  1. Загрузка образцовых растровых изображений в память

Избегайте загрузки всего битового массива в память сразу путем выборки уменьшенного размера, используя BitmapOptions и inSampleSize.

См., Например, документацию на Android

DexException

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

Эта ошибка возникает из-за того, что приложение при упаковке находит два файла .dex которые определяют один и тот же набор методов.

Обычно это происходит из-за того, что приложение случайно приобрело две отдельные зависимости в одной и той же библиотеке.

Например, скажем, у вас есть проект, и вы хотите полагаться на две библиотеки: A и B , каждая из которых имеет свои собственные зависимости. Если библиотека B уже имеет зависимость от библиотеки A , эта ошибка будет выбрана, если библиотека A будет добавлена ​​в проект сама по себе. Компиляция библиотеки B уже дала набор кода из A , поэтому, когда компилятор отправляется в библиотеку A , он находит уже обработанные методы библиотеки A


Чтобы решить проблему, убедитесь, что ни одна из ваших зависимостей не может быть случайно добавлена ​​дважды таким образом

UncaughtException

Если вы хотите обрабатывать исключенные снимки, попробуйте поймать их всех в методе onCreate для вас Класс приложения:

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

Регистрация собственного обработчика для неожиданных исключений

Вот как вы можете реагировать на исключения, которые не были обнаружены, подобно стандарту системы «Приложение XYZ разбилось»,

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

Затем зарегистрируйте этот класс приложения в вашем AndroidManifest.xml:

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow