Почему крашится LoaderManager при переключении вкладки ViewPager?

255
07 февраля 2018, 12:55

В главной активности у меня стоит ViewPager перелистывающий 4 страницы (фрагмента). В 1 фаргменте используется LoaderManager для асинхронной загрузки данных из БД, когда я переключаюсь на соседнюю вкладку все нормально, при переключении на вкладку 3-ю происходит краш

java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.LoaderManager android.support.v4.app.FragmentActivity.getSupportLoaderManager()' on a null object reference

Вот код 1-го фрагмента

    package com.evico.mycar.activity_fragments;
//Вырезал импорт что бы не загромождать код
public class Fuel_fragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>
{
    DataBase db;
    TextView item1;
    TextView num_1;
    float num1; // переменные для переобразования числа для отсечкеи знаков поле запятой
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
    {
        View fuel_fragment = inflater.inflate (R.layout.fragment_fuel, container, false);
        db = new DataBase(getActivity());
        db.open();
        item1 = (TextView) fuel_fragment.findViewById(R.id.last_add);
        num_1 = (TextView) fuel_fragment.findViewById(R.id.num_1);
        getActivity().getSupportLoaderManager().initLoader(1, null, this);
        getActivity().getSupportLoaderManager().getLoader(1).forceLoad();
        return fuel_fragment;
    }
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bnd)
    {
        return new MyLoader(getActivity(), db, id);
    }
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor)
    {
        switch (loader.getId())
        {
            case 1:
                getActivity().getSupportLoaderManager().getLoader(1).forceLoad();
                if (cursor.moveToLast())
                {
                    num1 = cursor.getFloat(0);
                }
                else
                {
                    num1 = 0;
                }
                String n1 = new DecimalFormat("#0.0").format(num1) + getResources().getString(R.string.Currency);
                num_1.setText(n1);
                break;
        }
    }
    @Override
    public void onLoaderReset(Loader<Cursor> loader)
    {
    }
    static class MyLoader extends CursorLoader
    {
        DataBase db;
        Cursor cursor;
        final int LoaderID;
        public MyLoader (Context context, DataBase db, int id)
        {
            super(context);
            this.db = db;
            LoaderID = id;
        }
        @Override
        public Cursor loadInBackground()
        {
            switch (LoaderID)
            {
                case 1:cursor = db.last_add();
                    break;
            }
            return cursor;
        }
    }
}

я пытался гуглить и кажется проблема в контексте (?) после краша в репорте указаны строчки ошибки

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

и

public class Fuel_fragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>
Answer 1

Проблема оказалась в том, что в главной активности, к которой принадлежит ViewPager нужно добавить mViewPager.setOffscreenPageLimit(5);

READ ALSO
Как добавить вторую очередь для ответа @JmsListner

Как добавить вторую очередь для ответа @JmsListner

Добрый день! Есть listener, который слушает очередь JMS MQ и отправляет ответ по умолчаниюВозможно ли добавить вторую очередь для ответов и сформировать...

204
jmeter hazelcast

jmeter hazelcast

Написал java request для Jmeter,который получает объект по ключу из hazelcastОбъект я вижу только в логах Jmeter

178
Как работает Comparator в Java

Как работает Comparator в Java

Читаю Хорстмана Java 8 изданиеВ одной из глав используются статические методы интерфейса Comparator

294
Хранение фрагментов в активити

Хранение фрагментов в активити

В активити с BottomNavigation всего 3 путкта меню и 3 фрагмента которые переключаются при навигацииДля одного из них нужно всегда хранить состояние

198