Java 使用支持库从加载程序更新碎片列表后应用程序崩溃

Java 使用支持库从加载程序更新碎片列表后应用程序崩溃,java,android,android-listview,android-listfragment,android-support-library,Java,Android,Android Listview,Android Listfragment,Android Support Library,我有一个使用支持库v4的加载程序,它用于在包含两个片段的活动中加载ListView,一个包含ListView(作为ListFragment的扩展),另一个包含一个按钮(可以在加载程序执行工作时单击) 该实现与AsyncTaskLoader的Android文档中提供的实现非常相似,后者也通过加载程序创建ListView,但监控部分除外,我的实现不需要监控更改: 由于应用程序支持API级别8,因此我使用FragmentActivity::getSupportLoaderManager方法按照文档中的

我有一个使用支持库v4的加载程序,它用于在包含两个片段的活动中加载ListView,一个包含ListView(作为ListFragment的扩展),另一个包含一个按钮(可以在加载程序执行工作时单击)

该实现与AsyncTaskLoader的Android文档中提供的实现非常相似,后者也通过加载程序创建ListView,但监控部分除外,我的实现不需要监控更改:

由于应用程序支持API级别8,因此我使用FragmentActivity::getSupportLoaderManager方法按照文档中的建议启动加载程序,以保持支持

当使用该类而不是新平台的内置片段和加载程序支持时,必须分别使用getSupportFragmentManager()和getSupportLoaderManager()方法来访问这些功能

作为从片段启动的加载程序,我必须使用ListFragment::getActivity方法调用FragmentActivity::getSupportLoaderManager方法,从而导致使用以下代码启动加载程序:

getActivity().getSupportLoaderManager().initLoader(0,  null, this).forceLoad();
应用程序在API高于8的情况下运行良好,但在级别8上,当加载程序尝试在加载后在UI上呈现列表时,应用程序将崩溃(loader::onLoadFinished方法)

调试时,我发现它在适配器上调用ArrayAdapter::addAll方法时崩溃,这确认了问题出在UI的呈现上。此时,应用程序将被抛出到SamplingProfilerIntegration类,在该类中,试图在类的静态部分执行与快照相关的操作:

这可能与文档中提到的蜂窝版本之前的UI呈现的特定行为有关,但我想不出是什么

在Honeycomb(3.0)之前,活动的状态是在暂停之前保存的。片段是大量的新状态,其动态性足以让人经常希望它们在暂停和停止之间发生变化。如果在保存片段状态后试图更改其状态,这些类将引发异常,以避免意外丢失UI状态。但是,在Honeycomb之前,这种限制太大,在Honeycomb中,状态是在暂停之前保存的。为了解决这个问题,在Honeycomb之前的平台上运行时,如果在状态保存和正在停止的活动之间更改片段,则不会引发异常。这意味着,在某些情况下,如果活动从上次保存的状态还原,则这可能是一个略早于用户上次看到的快照


我发现正在导入项目的支持库v4和v7不支持ArrayAdapter::addAll()方法,这导致应用程序崩溃

此问题与此问题相关,提出的解决方案适合解决我的问题:

因此,解决方案是实现我自己版本的ArrayAdapter类,以便之前的Android蜂窝版本可以使用它

/** Whether or not a snapshot is being persisted. */
private static final AtomicBoolean pending = new AtomicBoolean(false);

static {
    samplingProfilerMilliseconds = SystemProperties.getInt("persist.sys.profiler_ms", 0);
    samplingProfilerDepth = SystemProperties.getInt("persist.sys.profiler_depth", 4);
    if (samplingProfilerMilliseconds > 0) {
        File dir = new File(SNAPSHOT_DIR);
        dir.mkdirs();
        // the directory needs to be writable to anybody to allow file writing
        dir.setWritable(true, false);
        // the directory needs to be executable to anybody to allow file creation
        dir.setExecutable(true, false);
        if (dir.isDirectory()) {
            snapshotWriter = Executors.newSingleThreadExecutor(new ThreadFactory() {
                    public Thread newThread(Runnable r) {
                        return new Thread(r, TAG);
                    }
                });
            enabled = true;
            Log.i(TAG, "Profiling enabled. Sampling interval ms: "
                  + samplingProfilerMilliseconds);
        } else {
            snapshotWriter = null;
            enabled = true;
            Log.w(TAG, "Profiling setup failed. Could not create " + SNAPSHOT_DIR);
        }
    } else {
        snapshotWriter = null;
        enabled = false;
        Log.i(TAG, "Profiling disabled.");
    }
}