我很难正确实施装载机。我阅读了很多文章和 stackoverflow 帖子,并尝试了各种方法。但是还没有解决这个问题。我正在使用带有 PagerSlidingTabStrip 库的 viewpager 来创建 3 个选项卡布局(使用 FragmentPagerAdapter)。我正在使用 3 个单独的加载器来加载这 3 个选项卡的数据。
问题是,当我第一次加载我的应用程序时,即使 FragmentPagerAdapter 成功创建了相邻的片段,相邻的选项卡也不会调用 loadInBackground() 直到我滚动到这些选项卡。奇怪的是,一旦我旋转或按下 home 并再次打开应用程序,相邻的选项卡就会开始加载。这意味着如果视图被销毁并重新创建,则加载开始。
我还尝试对所有 3 个片段中的加载程序使用 startLoading(我相信我的 OnStartLoading 方法配置正确。我在该方法中调用 forceLoad() )。如果我使用 startLoading,则调用 loadInBackground()。然而, onLoadFinished() 不是!所以我的视图仍然显示一个空的旋转加载器,直到我移动到相邻的选项卡。
因此,简而言之,无论是否调用 loadInBackground(),在重新创建视图之前不会调用相邻页面的 onLoadFinished()。(或者当然,如果我只是移动到那些页面)
有人遇到过类似的问题吗?我觉得我已经尽我所能,并且不知道如何处理这个问题。
这是我的 onCreateView():
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.movie_grid, container, false);
LoaderManager lm = getLoaderManager();
lm.restartLoader(CONFIG_LOADER, null, new ConfigurationLoaderCallbacks());
lm.restartLoader(MOVIE_DATA_LOADER, null, new MovieDataLoaderCallbacks());
...
return v;
}
我的抽象 AsyncTaskLoader 类:
private D mData;
public DataLoader(Context context) {
super(context);
}
@Override
protected void onStartLoading() {
if (mData != null) {
deliverResult(mData);
} else {
forceLoad();
}
}
@Override
public void deliverResult(D data) {
mData = data;
if (isStarted())
super.deliverResult(data);
}
我的 onResume():
public void onResume() {
super.onResume();
// Call this to re-connect with an existing loader
LoaderManager lm = getLoaderManager();
if (lm.getLoader(MOVIE_DATA_LOADER) != null) {
lm.initLoader(MOVIE_DATA_LOADER, null, new MovieDataLoaderCallbacks());
}
if (lm.getLoader(CONFIG_LOADER) != null) {
lm.initLoader(CONFIG_LOADER, null, new ConfigurationLoaderCallbacks());
}
}