Быстрая смена приложения Bottom Navigation вылетает - PullRequest
0 голосов
/ 30 августа 2018

У меня есть Нижняя Навигация с фрагментом и Retrofit для вызова API

Я звоню loadFragment для переключения фрагментов, как показано ниже

private boolean loadFragment(Fragment fragment) {
        //switching fragment
        if (fragment != null) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.fragment_container, fragment)
                    .commit();
            return true;
        }
        return false;
    }

Проблема в том, что мое приложение вылетает, если я начинаю случайный щелчок и быстро меняю фрагмент, когда я проверяю logcat, он показывает NPE при настройке некоторых данных.

Мой фрагмент состоит из следующих методов

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_current, container, false);
    unbinder = ButterKnife.bind(this, view);
    context = getActivity();
    callCategoryAPI();
    return view;
}

callCategory() является вызовом модификации api в отдельном классе контроллера и возвращает ответ через interface, а затем устанавливает данные.

Так что я подозреваю, что мой API возвращает ответ (как его асинхронный), но представления недоступны, так как пользователь изменяет фрагмент (быстро), поэтому представления являются нулевыми.

Я уже пробовал setuserVisibleHint также пробовал блокировать клики в течение 1200 мс, а также проверял, создан ли мой фрагментный вид, Как остановить этот сбой? и сделать модернизированный вызов Lifecycle зависимым?

Logcat

at com.example.CurrentFragment $ 1.onApiSuccess (CurrentFragment.java:82) в com.example.services.current_statement.CurrentStatementController $ 2.onResponse (CurrentStatementController.java:91) at retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall $ 1 $ 1.run (ExecutorCallAdapterFactory.java:70) на android.os.Handler.handleCallback (Handler.java:790) на android.os.Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:171) на android.app.ActivityThread.main (ActivityThread.java:6606) в java.lang.reflect.Method.invoke (Method.java) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:518) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823)

-

Неустранимое исключение: java.lang.NullPointerException: попытка вызвать виртуальный метод void android.widget.TextView.setText (java.lang.CharSequence) 'с нулевым значением ссылка на объект в com.example.fragment.statements.CurrentFragment $ 1.onApiSuccess (CurrentFragment.java:82) в com.example.services.current_statement.CurrentStatementController $ 2.onResponse (CurrentStatementController.java:91) at retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall $ 1 $ 1.run (ExecutorCallAdapterFactory.java:70) на android.os.Handler.handleCallback (Handler.java:790) на android.os.Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:171) на android.app.ActivityThread.main (ActivityThread.java:6606) в java.lang.reflect.Method.invoke (Method.java) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:518) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823)

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Используйте эту библиотеку ниже, чтобы заблокировать действие, пока сетевая операция не будет завершена.

Точечный диалог

Это то, что я использовал для своего приложения на изображении, которое я показал вам раньше.

0 голосов
/ 17 февраля 2019

Я могу опоздать, но я надеюсь, что смогу помочь и другому разработчику, потому что я тоже столкнулся с этой проблемой. просто используйте isAdded() в вашем состоянии при onResponse обратном вызове внутри if-else

ex: внутри вашего onResponse обратного вызова:

if (isAdded()){
  // success response
} else {
  if(isAdded()){
    // error response
  }
}
0 голосов
/ 30 августа 2018

Это проблема:

Попытка вызвать виртуальный метод void android.widget.TextView.setText (java.lang.CharSequence) 'для ссылки на пустой объект

Вы хотели бы установить текст для просмотра текста, который является нулевым. Сначала вы должны проверить, что ваше текстовое представление не равно нулю:

if (textview != null){
    textview.setText("mytext");
}
...