Почему крашится приложение?

219
16 февраля 2018, 18:56

В главной активности находится класс фрагмента использующий LoaderManager для загрузки данных из БД для отображения их изменения в реальном времени, данные отображаются но после некоторого простоя все падает с ошибкой

java.util.concurrent.RejectedExecutionException: Task android.support.v4.content.ModernAsyncTask$3@344318a6 rejected from java.util.concurrent.ThreadPoolExecutor@287842e7[Running, pool size = 128, active threads = 3, queued tasks = 0, completed tasks = 22627]

и в логах указывается строка, где происходит падение

getActivity().getSupportLoaderManager().getLoader(11).forceLoad();

у меня несколько конструкций switch/case и ошибка возникает в случайном из них, но строка ошибки всегда

getActivity().getSupportLoaderManager().getLoader("номер лоадера").forceLoad();

вот сам класс фрагмента

public class Summary_fragment extends Fragment implements 
LoaderManager.LoaderCallbacks<Cursor>
{
    DataBase db;
int[] mcolors = new int[]{
        R.color.graph_1,
        R.color.graph_2,
        R.color.graph_3,
        R.color.graph_4,
        R.color.graph_5,
        R.color.graph_6,
        R.color.graph_7,
        R.color.graph_8,
        R.color.graph_9,
        R.color.graph_10
};
PieChart chart;
float pie0; // переменные для отображения графика
float pie1;
float pie2;
float pie3;
float pie4;
float total;
TextView current_value;
TextView total_value;
TextView last_date;
TextView last_price;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View summary_fragment = inflater.inflate (R.layout.fragment_summary, container, false);
    db = new DataBase(getActivity());
    db.open();
    chart = (PieChart) summary_fragment.findViewById(R.id.summary_chart);
    chart.setHighlightPerTapEnabled(false); //отключение выделения графика
    current_value = (TextView) summary_fragment.findViewById(R.id.current_mileage_value);
    total_value = (TextView) summary_fragment.findViewById(R.id.total_value);
    last_date = (TextView) summary_fragment.findViewById(R.id.last_date);
    last_price = (TextView) summary_fragment.findViewById(R.id.last_price_per_liter);
    getActivity().getSupportLoaderManager().initLoader(11, null, this);
    getActivity().getSupportLoaderManager().getLoader(11).forceLoad();
    getActivity().getSupportLoaderManager().initLoader(12, null, this);
    getActivity().getSupportLoaderManager().getLoader(12).forceLoad();
    getActivity().getSupportLoaderManager().initLoader(13, null, this);
    getActivity().getSupportLoaderManager().getLoader(13).forceLoad();
    chart.setHoleRadius(55);
    chart.setTransparentCircleRadius(58);
    chart.setNoDataText("Вы еще не ввели никаких данных");
    chart.getDescription().setEnabled(false); //убрать подпись внизу справа
    chart.setEntryLabelColor(Color.BLACK); //цвет текста подписей приклеенных к графику
    chart.getLegend().setEnabled(false);
    return summary_fragment;
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bnd)
{
    return new SummaryLoader(getActivity(), db, id);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor)
{
    switch (loader.getId())
    {
        case 11:
            getActivity().getSupportLoaderManager().getLoader(11).forceLoad();
            if (cursor.moveToFirst())
            {
                pie0 = cursor.getFloat(0);
                pie1 = cursor.getFloat(1);
                pie2 = cursor.getFloat(2);
                pie3 = cursor.getFloat(3);
                pie4 = cursor.getFloat(4);
                ArrayList<PieEntry> entries = new ArrayList<>();
                if (pie0 > 0)
                {
                    entries.add(new PieEntry(pie0, "тест1"));
                }
                if (pie1 > 0)
                {
                    entries.add(new PieEntry(pie1, "тест2"));
                }
                if (pie2 > 0)
                {
                    entries.add(new PieEntry(pie2, "тест3"));
                }
                if (pie3 > 0)
                {
                    entries.add(new PieEntry(pie3, "тест4"));
                }
                if (pie4 > 0)
                {
                    entries.add(new PieEntry(pie4, "тест5"));
                }
                PieDataSet dataset = new PieDataSet(entries, "данные");
                PieData data = new PieData(dataset);
                dataset.setColors(mcolors, getActivity());
                //dataset.setColors(ColorTemplate.MATERIAL_COLORS);
                //dataset.setDrawValues(false); //убрать числовые значения на  круге
                dataset.setSliceSpace(5f); //  разделение между кусками графика
                dataset.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); //вынос числовых значений наружу круга
                dataset.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); // вынос надписей наружу круга
                dataset.setValueTextSize(14);
                dataset.setSelectionShift(20); // отступы от краев экрана что бы текстовые метки не уходили за экран
                chart.setData(data);
                chart.invalidate();
                total = pie0 + pie1 + pie2 + pie3 + pie4;
                total_value.setText(new DecimalFormat("#0.00").format(total) + getResources().getString(R.string.Currency));
                break;
            }
        case 12:
            getActivity().getSupportLoaderManager().getLoader(12).forceLoad();
            if (cursor.moveToFirst())
            {
                current_value.setText(cursor.getString(0) + getResources().getString(R.string.Range_unit));
            }
            break;
        case 13:
            getActivity().getSupportLoaderManager().getLoader(13).forceLoad();
            if (cursor.moveToLast())
            {
                last_date.setText(cursor.getString(2));
                last_price.setText(new DecimalFormat("#0.00").format(cursor.getFloat(0)) + getResources().getString(R.string.Currency));
            }
            else
            {
                last_date.setText("-");
                last_price.setText(0 + getResources().getString(R.string.Currency));
            }
    }
}
@Override
public void onLoaderReset(Loader<Cursor> loader)
{
}
static class SummaryLoader extends CursorLoader
{
    DataBase db;
    Cursor cursor;
    final int LoaderID;
    public SummaryLoader (Context context, DataBase db, int id)
    {
        super(context);
        this.db = db;
        LoaderID = id;
    }
    @Override
    public Cursor loadInBackground()
    {
        switch (LoaderID)
        {
            case 11: cursor = db.sum_for_graph();
                break;
            case 12: cursor = db.get_current(); 
                break;
            case 13: cursor = db.last_add(); 
                break;
        }
        return cursor;
    }
}
}

и вот описание ошибки

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.evico.mycar, PID: 5637
java.util.concurrent.RejectedExecutionException: Task android.support.v4.content.ModernAsyncTask$3@fd286dd rejected from java.util.concurrent.ThreadPoolExecutor@da8f252[Running, pool size = 128, active threads = 2, queued tasks = 0, completed tasks = 33174]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2011)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:793)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1339)
    at android.support.v4.content.ModernAsyncTask.executeOnExecutor(ModernAsyncTask.java:447)
    at android.support.v4.content.AsyncTaskLoader.executePendingTask(AsyncTaskLoader.java:225)
    at android.support.v4.content.AsyncTaskLoader.onForceLoad(AsyncTaskLoader.java:153)
    at android.support.v4.content.Loader.forceLoad(Loader.java:329)
    at com.evico.mycar.activity_fragments.Fuel_fragment.onLoadFinished(Fuel_fragment.java:216)
    at com.evico.mycar.activity_fragments.Fuel_fragment.onLoadFinished(Fuel_fragment.java:35)
    at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:476)
    at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:444)
    at android.support.v4.content.Loader.deliverResult(Loader.java:126)
    at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:105)
    at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:37)
    at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:255)
    at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:80)
    at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:485)
    at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:502)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5221)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
READ ALSO
Как просмотреть байт код класса в рантайме?

Как просмотреть байт код класса в рантайме?

Как получить байт код класса, это понятно, можно при помощи идеи или же дефолтными средствами

167
Spring Boot, Tomcat: Не мапит реквесты

Spring Boot, Tomcat: Не мапит реквесты

Написал сервис на Spring Boot, после чего, было необходимо перевести его на TomcatДля этого необходимо было добавить плагин в gradle, чтобы получить...

192
Тест с помощью selenium java [требует правки]

Тест с помощью selenium java [требует правки]

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

210