Сбой приложения в фоновом режиме

#android #android-viewpager

#Android #android-viewpager

Вопрос:

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

 java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{317597f7 V.ED.... R......D 0,0-160,160} not attached to window manager
                                                                     at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:396)
                                                                     at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:322)
                                                                     at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)
                                                                     at android.app.Dialog.dismissDialog(Dialog.java:341)
                                                                     at android.app.Dialog.dismiss(Dialog.java:324)
                                                                     at com.example.app.fragments.LatestNewsFragment$3.onSuccess(LatestNewsFragment.java:178)
                                                                     at com.example.app.fragments.LatestNewsFragment$3.onSuccess(LatestNewsFragment.java:126)
                                                                     at com.example.app.tools.connection.ServerTool$4.onSuccess(ServerTool.java:202)
                                                                     at com.example.app.tools.connection.ServerTool$4.onSuccess(ServerTool.java:197)
                                                                     at com.example.app.tools.connection.RetrofitTool$APICallBack.onResponse(RetrofitTool.java:71)
                                                                     at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
  

Это фрагмент кода сбоя

  private void getLastNews() {
    if (dialogLoading == null) {
        dialogLoading = new LoadingDialog().showDialog(getActivity());
    }
    ServerTool.getLastNews(getActivity(), new ServerTool.APICallBack<List<NewsListModel>>() {
        @Override
        public void onSuccess(List<NewsListModel> response) {

            Log.d("response list", response.size()   "");
            newsList = response;
            NewsPagerAdapter helpAdapter = new NewsPagerAdapter(getActivity(), newsList);
            viewPagerImage.setAdapter(helpAdapter);
            timer = new Timer();
            viewPagerImage.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                }

                @Override
                public void onPageSelected(int position) {
                    if (position < newsList.size()) {
                        if (position < currentPage) {
                            currentPage--;
                        } else {
                            currentPage  ;
                        }
                    }
                }

                @Override
                public void onPageScrollStateChanged(int state) {

                }
            });
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    if (getActivity() == null)
                        return;
                    if (isAdded())
                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if (currentPage < newsList.size()) {
                                    viewPagerImage.setCurrentItem(currentPage  , true);
                                } else {
                                    currentPage = 0;
                                    viewPagerImage.setCurrentItem(currentPage, true);
                                }
                            }

                        });
                }
            }, 300, 2500);
            if (dialogLoading.isShowing()) {
                dialogLoading.dismiss();
            }
        }

        @Override
        public void onFailed(int statusCode, ResponseBody responseBody) {

            Log.d("onFailed", responseBody   "");
            if (dialogLoading.isShowing()) {
                dialogLoading.dismiss();
            }
        }


    });


}
  

Комментарии:

1. Можем ли мы узнать, что это за строка под номером 178 LatestNewsFragment.java ?

2. это загрузка диалога.dismiss();

3. Я вижу. Затем вы должны добавить нулевую проверку dialogLoading!=null перед dialogLoading.isShowing() . Дайте нам знать, работает ли это ? 🙂

4. все тот же сбой

Ответ №1:

ОС Android уничтожит действие, как только оно будет скрыто. поэтому необходимо удалить dismissDialog в onDestroy в вашей активности.

 @Override
protected void onDestroy() {
 dialogLoading.dismiss();
super.onDestroy();
}
  

Ответ №2:

Добавьте (dialogLoading!=null amp;amp; dialogLoading.isShowing()) перед закрытием диалогового окна.