Java 使用支持库从加载程序更新碎片列表后应用程序崩溃
我有一个使用支持库v4的加载程序,它用于在包含两个片段的活动中加载ListView,一个包含ListView(作为ListFragment的扩展),另一个包含一个按钮(可以在加载程序执行工作时单击) 该实现与AsyncTaskLoader的Android文档中提供的实现非常相似,后者也通过加载程序创建ListView,但监控部分除外,我的实现不需要监控更改: 由于应用程序支持API级别8,因此我使用FragmentActivity::getSupportLoaderManager方法按照文档中的建议启动加载程序,以保持支持 当使用该类而不是新平台的内置片段和加载程序支持时,必须分别使用getSupportFragmentManager()和getSupportLoaderManager()方法来访问这些功能 作为从片段启动的加载程序,我必须使用ListFragment::getActivity方法调用FragmentActivity::getSupportLoaderManager方法,从而导致使用以下代码启动加载程序: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方法按照文档中的
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.");
}
}