- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个将搜索结果加载到 fragment 列表中的搜索函数。问题是搜索向 API 发出了两个请求:一个针对类型 A,一个针对类型 B。
我的实现方式是创建一个包含两个 fragment 的 ViewPager,FragmentA 和 FragmentB。每个人都通过扩展 AsyncTaskLoader 的自定义加载器调用带有搜索查询的 API 端点,AsyncTaskLoader 执行 API 查询并返回结果。这作为异常(exception)工作; fragment 接收搜索结果并将它们显示在列表中。
我在这个构造中遇到的唯一问题是,虽然两个 fragment 都使用单独的 LOADER_ID 启动它们的加载器,但实际上只有 FragmentA 从 AsyncTaskLoader 调用 loadInBackground()
。 只有当我滑动到 ViewPager 中的 FragmentB 时,它才会调用 restartLoader()
(然后又调用 loadInBackground()
),执行 API 请求搜索并返回结果。
我想并行运行两个加载器的原因是,当 FragmentB 有搜索结果时,ViewPager 应该显示 FragmentB。
搜索列表 fragment :
public class SearchListFragment extends Fragment implements LoaderManager.LoaderCallbacks<SearchResults> {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().enableDebugLogging(BuildConfig.DEBUG);
if (mSearchType == SearchType.ARTIST) {
getLoaderManager().initLoader(R.id.search_artist_loader, null, this);
} else {
getLoaderManager().initLoader(R.id.search_track_loader, null, this);
}
BusProvider.getInstance().register(this);
}
@Override
public Loader<ApiResponse> onCreateLoader(int id, Bundle args) {
int offset = 0;
String query = null;
if (args != null) {
if (args.containsKey("offset")) {
offset = args.getInt("offset");
}
if (args.containsKey(SearchManager.QUERY)) {
query = args.getString(SearchManager.QUERY);
mSearchQuery = query;
}
}
Log.d(TAG, "onCreateLoader for " + mSearchType.name());
Log.d(TAG, "id: " + id);
SearchLoader loader = new SearchLoader(getActivity(), mSearchType, offset, query);
return loader;
}
@Override
public void onLoadFinished(Loader<SearchResults> loader, SearchResults data) {
if (data != null) {
if (data.mSampleList.isEmpty()) {
mNoResults.setVisibility(View.VISIBLE);
} else {
mAdapter.swapApiResponse(data);
mListView.setVisibility(View.VISIBLE);
}
mLoading.setVisibility(View.GONE);
} else {
Exception exception = ((SearchLoader) loader).getError();
if(exception != null) {
Log.e(TAG, exception.toString());
Log.e(TAG, exception.getMessage());
Log.e(TAG, exception.getLocalizedMessage());
}
mNoResults.setVisibility(View.VISIBLE);
mLoading.setVisibility(View.GONE);
}
}
@Override
public void onLoaderReset(Loader<ApiResponse> loader) {
}
}
自定义加载器:
public class SearchLoader extends AsyncTaskLoader<ApiResponse> {
private static final String TAG = SearchLoader.class.getSimpleName();
private SearchResults mApiResponse;
private SearchType mSearchType;
private int mOffset;
private String mSearchQuery;
private Exception error = null;
public SearchLoader(Context context, SearchType type, int offset, String query) {
super(context);
mSearchType = type;
mOffset = offset;
mSearchQuery = query;
}
@Override
public ApiResponse loadInBackground() {
try {
return tryLoadInBackground();
} catch (Exception e) {
error = e;
return null;
}
}
public ApiResponse tryLoadInBackground() throws Exception {
if (mSearchQuery != null) {
Map<String, String> parameters = Utils.parametersMap("q:" + mSearchQuery, "offset:" + String.valueOf(mOffset));
if (mSearchType == SearchType.ARTIST) {
return API.getRestAdapter().searchTypeA(parameters);
} else {
return API.getRestAdapter().searchTypeB(parameters);
}
}
return null;
}
@Override
protected void onStartLoading() {
Log.d(TAG, "onStartLoading for " + mSearchType.name());
if (mApiResponse != null) {
deliverResult(mApiResponse);
}
if (takeContentChanged() || mApiResponse == null) {
forceLoad();
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
@Override
public void onCanceled(ApiResponse data) {
// Attempt to cancel the current asynchronous load.
super.onCanceled(data);
onReleaseResources(data);
}
@Override
protected void onReset() {
// Ensure the loader has been stopped.
onStopLoading();
// At this point we can release the resources associated with 'apps' if needed
if (mApiResponse != null) {
onReleaseResources(mApiResponse);
mApiResponse = null;
}
}
@Override
public void deliverResult(ApiResponse data) {
if (isReset()) {
// An async query came in while the loader is stopped. We don't need the result
if (data != null) {
onReleaseResources(data);
}
return;
}
SearchResults oldData = mApiResponse;
mApiResponse = data;
if (isStarted()) {
// If the loader is currently started, we can immediately deliver a result
super.deliverResult(mApiResponse);
}
// At this point we can release the resources associated with 'oldApps' if needed;
// now that the new result is delivered we know that it is no longer in use
if (oldData != null && oldData != mApiResponse) {
onReleaseResources(oldData);
}
}
/**
* Helper function to take care of releasing resources associated with an actively loaded data set
*/
private void onReleaseResources(ApiResponse data) {
// For a simple list there is nothing to do
// but for a Cursor we would close it here
}
public Exception getError() {
return error;
}
}
最佳答案
你读过这个吗?这可能与执行者有关。
http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html
关于android - 并行运行两个 AsyncTaskLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23361765/
我正在尝试创建一个将搜索结果加载到 fragment 列表中的搜索函数。问题是搜索向 API 发出了两个请求:一个针对类型 A,一个针对类型 B。 我的实现方式是创建一个包含两个 fragment 的
我在加载器方面遇到了一些问题,但我不明白我做错了什么。这是初始化和启动 Loader 的 fragment import android.os.Bundle; import android.suppo
这似乎是一个愚蠢的问题,但我无法理解 AsynctaskLoader 的状态。 我已经多次阅读文档以及网络上的其他教程。但是,我仍然无法理解Asynctask 何时处于Reset 状态 看看从官方文档
有几个关于如何实现自定义 AsyncTaskLoader 的教程,但我发现没有一个讨论如何处理数据缓存 - 在所有这些教程中,数据都只是加载和传送。 您能否给我一些提示,说明如何实现自定义 Async
我不明白AsyncTaskLoader中的所有函数是做什么的,比如onCancelLoad()和onForceLoad()。所有函数及其调用顺序均未正确记录。 假设我想在后台下载一个文件并在需要时取消
在我最近的一个 SO 问题中,有人建议我使用 Loader 作为我的解决方案。所以在这里我试图了解如何实现一个简单的 AsyncTaskLoader 这是我想出的: public class Scra
我有一个 Activity 实现了所有这些代码所在的 fragment 。由于代码是 secret 的,因此最好通过示例对此进行解释。这个例子反射(reflect)了正在尝试做的事情以及我通过测试观察
我需要做出设计决定。 从我在 android 开发者网站上读到的内容来看,我想我想实现一个服务,它启动一个 AsyncTaskLoader 以在后台从操作系统进程加载数据。 在 android 开发人
我想使用 Compatibility Package 在我的项目中实现 AsyncTaskLoader,所以我按照 Android Docs 中的 Loader 手册进行操作。 问题是加载器什么都不做
好吧,我很难理解我的应用程序出了什么问题。所以我有带有这样的选项卡的 ViewPager: 适配器.java public class CustomPagerAdapter extends Fragm
我正在尝试编译示例: http://developer.android.com/reference/android/content/AsyncTaskLoader.html 在onCreateLoad
在 onCreate() 中初始化 Loader 并在按下按钮时重新启动 Loader 的简单代码。关于 android 文档 getLoaderManager().restartLoader() 应
我使用的是 v13 支持库,支持取消所需的所有函数(例如 isLoadInBackgroundCanceled 和 cancelLoadInBackground 都完全缺失。 最佳答案 已回答 her
我有一个简单的 fragment ,试图在其中实现 AsyncTaskLoader。但是我遇到了一个编译时错误: 错误:类型不兼容必需的:加载器成立:装载无人机 错误在 onCreateLoader
我正在使用这个启动一个 AsyncTaskLoader: getLoaderManager().initLoader(0, null, this); 我想我可以用它来判断它是否正在运行: Boolea
谁能告诉我 AsyncTaskLoader 和 AsyncQueryHandler 之间的区别? 我想在我的应用程序中使用 AsynTaskLoader。我的应用程序中现有的是 AsyncQueryH
我想为我的自定义数据源实现 AsyncTaskLoader: public class DataSource { public interface DataSourceObserver {
我的 AsyncTaskLoader 有几个问题,不确定它们是否相关,因为它们都是在尝试重新启动加载程序时发生的。在我的应用程序中,我有 3 个自定义 CursorAdapter 实例,由 1 个单例
他们到处告诉我们应该使用 ASyncTaskLoaders,因为他们非常擅长不阻塞 UI 线程。现在可以使用 Volley。 我想我们不能同时使用它们,因为 Volley 自己做背景。你怎么看?哪个更
我试图了解 AsyncTaskLoaders 的一些细节.这对其他人来说可能是显而易见的,但我找不到一个明确的示例或定义来演示和解释当您覆盖 deliverResult() 时会发生什么情况。方法。实
我是一名优秀的程序员,十分优秀!