Не работает класс на андроид 4.4.х

241
18 января 2018, 20:43

Столкнулся с проблемой в работоспособности кода на ранних версиях андроида. На устройстве с ОС 7.0 всё нормально функционирует, на ОС 4.4.х приложение крашится.

В логах которые прочитал в Firebase Crash Reporting пишет следующее:

Exception java.lang.NoClassDefFoundError: org.quuux.sack.Sack

Вставил полностью класс в приложение, а не через добавление в build.gradle

Содержимое класса:

import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.support.v4.util.AtomicFile;
import android.util.Pair;
import com.google.gson.Gson;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class Sack<T> {
    public enum Status {
        SUCCESS,
        ERROR
    }
    public interface Listener<T> {
        void onResult(Sack.Status status, T obj);
    }
    private final Class<T> mClass;
    private final File mPath;
    private final Gson mGson = new Gson();
    Sack(final Class<T> klass, final File path) {
        mClass = klass;
        mPath = path;
    }
    public Pair<Sack.Status, T> doLoad() {
        final AtomicFile file = new AtomicFile(mPath);
        try {
            final FileInputStream in = file.openRead();
            final String s = slurp(new BufferedInputStream(new GZIPInputStream(in)), 4096);
            final Pair<Sack.Status, T> rv = new Pair<>(Sack.Status.SUCCESS, mGson.fromJson(s, mClass));
            in.close();
            return rv;
        } catch (IOException e) {
            return new Pair<Sack.Status, T>(Sack.Status.ERROR, null);
        } finally {
        }
    }
    public static String slurp(final InputStream is, final int bufferSize) {
        final char[] buffer = new char[bufferSize];
        final StringBuilder out = new StringBuilder();
        try {
            Reader in = new InputStreamReader(is, "UTF-8");
            for (; ; ) {
                int rsz = in.read(buffer, 0, buffer.length);
                if (rsz < 0)
                    break;
                out.append(buffer, 0, rsz);
            }
        } catch (IOException ex) {
            return null;
        }
        return out.toString();
    }
    public AsyncTask<Void, Void, Pair<Sack.Status, T>> load(final Sack.Listener<T> listener) {
        @SuppressLint("StaticFieldLeak")
        final AsyncTask<Void, Void, Pair<Sack.Status, T>> task = new AsyncTask<Void, Void, Pair<Sack.Status, T>>() {
            @Override
            protected Pair<Sack.Status, T> doInBackground(final Void... params) {
                return doLoad();
            }
            @Override
            protected void onPostExecute(final Pair<Sack.Status, T> t) {
                if (listener != null)
                    listener.onResult(t.first, t.second);
            }
        };
        task.execute();
        return task;
    }
    public AsyncTask<Void, Void, Pair<Sack.Status, T>> load() {
        return load(null);
    }
public Pair<Sack.Status, T> doCommit(final T obj) {
    final AtomicFile file = new AtomicFile(mPath);
    FileOutputStream str = null;
    try {
        str = file.startWrite();
        final BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(str));
        out.write(mGson.toJson(obj).getBytes());
        out.flush();
        out.close();
        str.flush();
        str.close();
        file.finishWrite(str);
        return new Pair<Sack.Status, T>(Sack.Status.SUCCESS, obj);
    } catch (IOException e) {
        if (str != null)
            file.failWrite(str);
        return new Pair<Sack.Status, T>(Sack.Status.ERROR, null);
    }
}
public AsyncTask<T, Void, Pair<Sack.Status, T>> commit(final T obj, final Sack.Listener<T> listener) {
    @SuppressLint("StaticFieldLeak") final AsyncTask<T, Void, Pair<Sack.Status, T>> task = new AsyncTask<T, Void, Pair<Sack.Status, T>>() {
        @Override
        protected Pair<Sack.Status, T> doInBackground(final T... params) {
            return doCommit(params[0]);
        }
        @Override
        protected void onPostExecute(final Pair<Sack.Status, T> t) {
            if (listener != null)
                listener.onResult(t.first, t.second);
        }
    };
    task.execute(obj);
    return task;
}
public AsyncTask<T, Void, Pair<Sack.Status, T>> commit(final T obj) {
    return commit(obj, null);
}
public static <T> Sack<T> open(final Class<T> entity, final File path) {
    return new Sack<T>(entity, path);
}}

Есть люди, которые могут помочь, что здесь выполняется не так (почему на андроид 4.4 вылетает приложение). Заранее большое спасибо кто не останется в стороне!

READ ALSO
Не прогружаются ноды, добавленные в Task JavaFX

Не прогружаются ноды, добавленные в Task JavaFX

Добрый деньУ меня идёт прогрузка сцены

255
Как изменить строку кода адаптера для соответствия фрагменту?

Как изменить строку кода адаптера для соответствия фрагменту?

У меня есть CursorAdapter для RecyclerView, написанный для активности, я решил перенести список в фрагмент, но не могу понять, как нужно изменить строку...

271
Можно ли использовать экран в Андроид полностью?

Можно ли использовать экран в Андроид полностью?

Задача использовать экран устройства полностью, вместе со строкой где часы и всплывающие сообщенияМожно ли это сделать или по крайней мере...

257
Вопрос о реализация чата

Вопрос о реализация чата

Есть простой чат на андроиде и сервер на ЯваСоеденение между ними происходит с помощью сокета

233