【问题标题】:Android app crashed when minimized and rotatedAndroid 应用程序在最小化和旋转时崩溃
【发布时间】:2015-12-04 18:58:50
【问题描述】:

我的应用在以下情况下崩溃:

  1. 在完全呈现之前最小化(即,启动用户操作以启动片段,同时单击 Home 键)。
  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)

【问题讨论】:

  • 这会准确地告诉您问题出在什么地方。什么:java.lang.ArrayIndexOutOfBoundsException 更具体地说,您试图引用索引 4 处的数组元素,而所述数组只有 2 个元素。其中:MyActivity 第 124 行。检查该行的内容。
  • 该代码在 FragmentManager 类中,它是 Android 代码。
  • Activity 不是在尝试更改其内容而不处于恢复状态吗?当屏幕旋转时,Activity 被销毁并重新创建。如果您保留旧 Activity 的引用并尝试更改其内容,它将崩溃。当您在加载数据时按 Home 并且 Activity 的状态更改为已暂停并且您尝试更改它,它也会崩溃。当您等待足够长的时间让 Activity 和 Fragment 完全加载时,就没有问题了。当你按 Home 或旋转时,可能会出现上述任一情况
  • “android.app.Activity.performCreate...”之前的堆栈跟踪中没有更多的日志输出吗?
  • 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java :2387)

标签: android android-fragments crash fragmentmanager


【解决方案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);
}

}

【讨论】:

  • 这个crash可能是使用commitAllowingStateLoss()引起的。这种情况可能非常特殊,因为我们有一个 ViewPager。关于在设备旋转或最小化时保存和恢复 ViewPager 的最佳方法是什么?
  • 就我而言,我扩展了 PagerAdapter 类并实现了处理上述问题的 destroyItem、isViewFromObject 和 instantiateItem 方法。我可以发布代码示例。所以我在 listview 中需要这个适配器,它可以工作,也可以独立工作。
  • 嗨@Kenan,你能发布你的例子吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多