【问题标题】:Xamarin android app crashes when resumingXamarin android 应用程序在恢复时崩溃
【发布时间】:2017-09-25 08:45:57
【问题描述】:

显然我们的 Xamarin 原生应用在一段时间未使用后有时会在 Android 上崩溃,但我无法重现它。

崩溃似乎是在我们的选项卡式应用程序中对其中一个片段进行充气时引起的。知道这可能是什么吗?报告仅适用于 Android 7,尽管该应用的用户很少,因此可能是巧合。该应用程序以 Android 7.0 为目标,但以前当应用程序将目标框架设置为 android 6.0 时,错误是相同的(有几行不同)。有点运气谷歌搜索。

2017 年 11 月 17 日更新:我已尝试捕获异常(尝试围绕 BuildingListFragment 看到的 2 行代码块)并抛出我自己的异常,但它没有被捕获,并且在 google play 中出现了相同的异常控制台崩溃报告。这对我来说仍然是一个问题,我们将不胜感激。

android.runtime.JavaProxyThrowable: at AlarmKeeper.Droid.BuildingListFragment.OnCreateView (Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState) [0x00028] in <8584c8930bb24ecaa4ab45fc24b599b6>:0
at Android.Support.V4.App.Fragment.n_OnCreateView_Landroid_view_LayoutInflater_Landroid_view_ViewGroup_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_inflater, System.IntPtr native_container, System.IntPtr native_savedInstanceState) [0x00020] in <1e89c43d3c7d48b5ba69bfc0b1bdf114>:0
at (wrapper dynamic-method) System.Object:fc5b2ba7-0fe0-4b23-b87c-c512566cc5f6 (intptr,intptr,intptr,intptr,intptr)
at md5446876e046c50288069676734a083198.BuildingListFragment.n_onCreateView (Native Method)
at md5446876e046c50288069676734a083198.BuildingListFragment.onCreateView (BuildingListFragment.java:30)
at android.support.v4.app.Fragment.performCreateView (Fragment.java:2248)
at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1340)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManager.java:1569)
at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1636)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated (FragmentManager.java:2977)
at android.support.v4.app.FragmentController.dispatchActivityCreated (FragmentController.java:192)
at android.support.v4.app.FragmentActivity.onStart (FragmentActivity.java:603)
at android.support.v7.app.AppCompatActivity.onStart (AppCompatActivity.java:178)
at android.app.Instrumentation.callActivityOnStart (Instrumentation.java:1256)
at android.app.Activity.performStart (Activity.java:6972)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2937)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3045)
at android.app.ActivityThread.-wrap14 (ActivityThread.java)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1642)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:154)
at android.app.ActivityThread.main (ActivityThread.java:6776)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1410)

片段类:

public class BuildingListFragment : Fragment
{
    ...

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView(inflater, container, savedInstanceState);
        var view = inflater.Inflate(Resource.Layout.BuildingListFragment, container, false);

        ...
    }
...
}

适配器:

public class TabAdapter : FragmentPagerAdapter, IconPagerAdapter
{
    private MainActivity _context;

    public TabAdapter (MainActivity context, FragmentManager p0) : base(p0)
    {
        _context = context;
    }

    public override Fragment GetItem(int position)
    {
        switch (position) {
        case 0:
            return new BuildingListFragment ();
        case 1:
            return AlarmListFragment.NewInstance("active");
        case 2:
            return AlarmListFragment.NewInstance("confirmed");
        case 3:
            return new ProfileFragment();
        }

        return null;
    }

    public override int Count
    {
        get{ return 4; }
    }

    ...
}

主活动:

    private TabAdapter _adapter;
    private ViewPager _viewPager;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        ...

            _viewPager = FindViewById<ViewPager>(Resource.Id.main_view_pager);
            _adapter = new TabAdapter(this, SupportFragmentManager);
            _viewPager.Adapter = _adapter;
            _viewPager.AddOnPageChangeListener(this);

            _tabLayout = FindViewById<TabLayout>(Resource.Id.main_tab_layout);
            TabLayoutHelper.SetupWithViewPager(_tabLayout, _viewPager);

            var activeItem = Intent.GetIntExtra(ArgActiveFragment, 0);
            if (activeItem != 0)
            {
                _viewPager.SetCurrentItem(activeItem, false);
            }

BuildingListFragment.axml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:background="@color/background">
    <LinearLayout
        android:id="@+id/error_container"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:background="@color/red"
        android:gravity="center"
        android:visibility="gone">
        <TextView
            android:id="@+id/error_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/white"
            android:textSize="16dp" />
    </LinearLayout>
    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/building_list_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:minWidth="25px"
            android:minHeight="25px"
            android:clickable="true">
            <ListView
                android:id="@+id/building_list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingTop="15dp"
                android:clipToPadding="false"
                android:divider="@color/light_grey"
                android:dividerHeight="1dp" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="normal"
                android:textSize="15dp"
                android:gravity="center"
                android:text="@string/no_buildings_in_list"
                android:id="@+id/no_buildings_text"
                android:textColor="@color/grey"
                android:layout_gravity="center" />
        </FrameLayout>
    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>

【问题讨论】:

  • Activity 恢复时你的项目崩溃了?
  • 恢复活动和片段工作。据一位用户说,他告诉我这可能发生在几个小时没有使用该应用程序时。
  • 这与Android的墓碑机制有关。您需要探索如何保存应用程序的状态,然后如何从中恢复。您可以在手机/模拟器上启用“不保留活动”选项来重现此问题。
  • 我启用了“不保留活动”,但我没有重现错误。
  • 更新了描述。未捕获异常。

标签: android xamarin xamarin.android


【解决方案1】:

不确定您是否对此仍有疑问,但我在遇到类似问题时发现了此线程;启用“不保留活动”选项后,我无法发生崩溃,但我设法通过将“后台进程限制”选项设置为“最多 1 个进程”来解决该问题。

【讨论】:

  • 已修复。有一些价值没有被保留。
猜你喜欢
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多