#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())
перед закрытием диалогового окна.