Приложение для Android аварийно завершало работу при сворачивании и повороте

Мое приложение падает в следующем случае:

  1. Свернуть до полного рендеринга (например, запустить действие пользователя, чтобы запустить фрагмент, а тем временем нажать клавишу «Домой»).
  2. Затем поверните устройство
  3. Затем разверните приложение.

Однако он отлично работает, если я либо долго жду завершения рендеринга перед сворачиванием, либо не поворачиваю устройство после сворачивания.

Я пытался выяснить, что сделала система, когда я повернул приложение после его минимизации. Для этого не было вывода журналов.

У меня также есть ViewPager в действии. Я не уверен, что ViewPager играет роль в аварии.

Отчет о сбое выглядит так:

Caused by: java.lang.ArrayIndexOutOfBoundsException: length=2; index=4
  at android.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1750)
  at android.app.Activity.onCreate(Activity.java:943)
  at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:257)
  at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:58)
  at com.blackberry.emailviews.activity.SwipeableEmailActivity.onCreate(MyActivity.java:124)
  at android.app.Activity.performCreate(Activity.java:6034)

person M2014    schedule 04.12.2015    source источник
comment
Это говорит вам точно, что и где проблема. Что: java.lang.ArrayIndexOutOfBoundsException Более конкретно, вы пытаетесь сослаться на элемент массива с индексом 4, тогда как указанный массив имеет только 2 элемента. Где: строка MyActivity 124. Проверьте, что находится в этой строке.   -  person Melquiades    schedule 04.12.2015
comment
Этот код находится внутри класса FragmentManager, который является кодом Android.   -  person M2014    schedule 04.12.2015
comment
Разве активность не пытается изменить свое содержимое, не находясь в возобновленном состоянии? Когда экран поворачивается, действие уничтожается и создается заново. Если вы сохраните ссылку на старую активность и попытаетесь изменить ее содержимое, произойдет сбой. Когда вы нажимаете «Домой» во время загрузки данных, а состояние «Активность» изменяется на «приостановлено», и вы пытаетесь изменить его, оно также падает. Когда вы достаточно долго ждете, пока Activity и Fragment полностью загрузятся, проблем не возникает. Когда вы нажимаете «Домой» или поворачиваете, может произойти одна из вышеперечисленных ситуаций.   -  person Hugo Hideki Yamashita    schedule 04.12.2015
comment
Разве в трассировке стека нет больше вывода журнала перед android.app.Activity.performCreate...?   -  person The Original Android    schedule 06.12.2015
comment
в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)   -  person M2014    schedule 07.12.2015


Ответы (1)


Поместили ли вы android:configChanges="orientation|screenSize" для активности в файл AndroidMAnifext.xml.

Пример использования PagerAdapter:

открытый класс CustomPagerAdapter расширяет PagerAdapter {

public static final String TAG = CustomPagerAdapter.class.getSimpleName();
private Context context;
private ArrayList<Object> data;
private LayoutInflater inflater;

public CustomPagerAdapter(Context context, ArrayList<Object> data)
{
    this.data = data;
    this.context = context;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public Object instantiateItem(ViewGroup pager, final int curentItem)
{
    Log.d(TAG, "instantiateItem called for position " + curentItem);

    //Inflate
    final View localView = inflater.inflate(R.layout.home_news_slide, null);
    if(null!=localView){
        final Data currentData= (Data) this.data.get(curentItem);
        TextView title = (TextView)localView.findViewById(R.id.title_textview);
        TextView date = (TextView)localView.findViewById(R.id.date_textview);
        final ImageView imageView = (ImageView) localView.findViewById(R.id.home_slide_image);
        //Set
        title.setText(currentData.getTitle());
        date.setText(Util.dateParse((currentData.getDate())));
        imageView.setImageUrl(currentData.getArticleImage(), VolleyService.getInstance(context).getImageLoader());
        imageView.setDefaultImageResId(R.drawable.default_img);
        imageView.setErrorImageResId(R.drawable.default_img);
        //Event listener for Fragment switch
        localView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Open some activity
            }
        });
        pager.addView(localView,curentItem);
    }

    return localView;
}

@Override
public int getCount() {
    return data.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == object;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object)
{
    container.removeView((View) object);
}

}

person Kenan Begić    schedule 04.12.2015
comment
Этот сбой может быть вызван использованием commitAllowingStateLoss(). Ситуация может быть очень специфичной, потому что у нас есть ViewPager. Любые советы о том, как лучше всего справиться с сохранением и восстановлением ViewPager, когда устройство вращается или свернуто? - person M2014; 07.12.2015
comment
В моем случае я расширил класс PagerAdapter и реализовал методы destroyItem, isViewFromObject и InstantiateItem, которые решают вашу проблему выше. Я могу опубликовать пример кода. Поэтому мне нужен этот адаптер в списке, и он работает, а также работает автономно. - person Kenan Begić; 07.12.2015
comment
Привет @Kenan, не могли бы вы опубликовать свой пример? Спасибо. - person M2014; 09.12.2015