我想使用兼容包在我的项目中实现AsyncTaskLoader,所以我遵循Android Docs中的Loader手册.
问题是Loader什么都不做,似乎loadInBackground()
永远不会被调用
知道我的代码有什么问题吗?(ExpandableListFragment
扩展Fragment
,但不覆盖任何关键方法)
谢谢 :-)
/**编辑:
我意识到(最近,我是个白痴),AsyncTaskLoader是一个抽象类,所以我需要将它子类化... m(__)m我留下问题以防有人来到我身后,谁知道......
public class AgendaListFragment extends ExpandableListFragment implements
LoaderManager.LoaderCallbacks<JSONArray> {
private TreeMap<Integer, ArrayList<Evento>> mItems = new TreeMap<Integer, ArrayList<Evento>>();
private AgendaListAdapter mAdapter;
private ProgressBar mProgressBar;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_agenda, container);
mProgressBar = (ProgressBar) root.findViewById(R.id.loading);
return root;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new AgendaListAdapter(getActivity());
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<JSONArray> onCreateLoader(int arg0, …
Run Code Online (Sandbox Code Playgroud) 我有一个CursorLoader
直接使用SQLite数据库而不是使用的自定义ContentProvider
.这个加载器使用a ListFragment
支持CursorAdapter
.到现在为止还挺好.
为了简化操作,我们假设UI上有一个Delete按钮.当用户单击此按钮时,我会从数据库中删除一行,并调用onContentChanged()
我的加载程序.此外,在onLoadFinished()
回调时,我调用notifyDatasetChanged()
我的适配器以刷新UI.
当删除命令快速连续发生时,意味着快速连续onContentChanged()
调用,bindView()
最终将使用陈旧数据.这意味着行已被删除,但ListView仍在尝试显示该行.这导致了Cursor异常.
我究竟做错了什么?
这是一个自定义的CursorLoader(基于Diane Hackborn女士的建议)
/**
* An implementation of CursorLoader that works directly with SQLite database
* cursors, and does not require a ContentProvider.
*
*/
public class VideoSqliteCursorLoader extends CursorLoader {
/*
* This field is private in the parent class. Hence, redefining it here.
*/
ForceLoadContentObserver mObserver;
public VideoSqliteCursorLoader(Context context) {
super(context); …
Run Code Online (Sandbox Code Playgroud) android asynctaskloader android-loadermanager android-cursorloader android-loader
我正在尝试使用an AsyncTaskLoader
在后台加载数据以填充详细信息视图以响应所选的列表项.我已经得到它主要工作,但我仍然有一个问题.如果我在列表中选择第二个项目然后在第一个选定项目的加载完成之前旋转设备,则onLoadFinished()
呼叫将报告给正在停止的活动而不是新活动.只选择一个项目然后旋转时,这样可以正常工作.
这是我正在使用的代码.活动:
public final class DemoActivity extends Activity
implements NumberListFragment.RowTappedListener,
LoaderManager.LoaderCallbacks<String> {
private static final AtomicInteger activityCounter = new AtomicInteger(0);
private int myActivityId;
private ResultFragment resultFragment;
private Integer selectedNumber;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myActivityId = activityCounter.incrementAndGet();
Log.d("DemoActivity", "onCreate for " + myActivityId);
setContentView(R.layout.demo);
resultFragment = (ResultFragment) getFragmentManager().findFragmentById(R.id.result_fragment);
getLoaderManager().initLoader(0, null, this);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("DemoActivity", "onDestroy for " + myActivityId);
}
@Override
public void onRowTapped(Integer number) {
selectedNumber …
Run Code Online (Sandbox Code Playgroud) android asynctaskloader android-loadermanager android-loader
使用AsyncTaskLoader时,如何更新显示正在更新状态的进度条?通常你等待回调完成后删除,但是如何运行更新?您是否让主线程(ui)在设置数据时轮询数据?
编辑:我在谈论AsyncTaskLoader,看看加载器部分.这是类的链接:http://developer.android.com/reference/android/content/AsyncTaskLoader.html
我想用它,因为它的未来:),我知道如何用AsyncTask做到这一点.
我一直在阅读关于此事的Android文档(AsyncTask,Thread)和vogella教程,但我还有疑问.
例如,我想从Android应用程序向服务器发送消息.我希望这个过程能够做出回应.我该怎么用?
我已经看到了他们Thread
为非阻止UI 创建新的示例,但是这样我们没有进程的进度,你也必须处理响应,Thread
因为该run()
方法没有返回任何东西.
AsyncTask
似乎比较好的选择Thread
,但我不知道使用a AsyncTask
而不是a 的后果是什么Thread
.
multithreading android android-asynctask asynctaskloader difference
我在Android Studio中获得了不推荐使用getSupportLoaderManager的信息.但是我想打个电话:
getSupportLoaderManager().initLoader(0, null, mRecipeLoaderManager);
Run Code Online (Sandbox Code Playgroud)
该电话的替代方案应该是什么?或者我仍然可以使用getSupportLoaderManager而不用担心?
有没有人有幸为Robolectric的AsyncTaskLoaders编写单元测试?我为AsyncTask尝试了此示例的修改版本,但它没有表现出相同的行为.特别onLoadFinished
是永远不会被称为.有没有可行的例子来测试装有Robolectric的装载机?
我正在扩展AsyncTaskLoader,后来我通过LoaderManager在Fragment中使用它.是否有建议的方法来处理异步任务期间发生的错误?我想弹出消息,要求用户在发生互联网连接错误时取消或重试.
我现在能想到的唯一方法是让Loader在出错时返回null或将加载的对象包装到另一个具有状态代码的对象中.
我有一个SherlockListFragment
实现自定义AsyncTaskLoader
.在被覆盖的时候onStartLoading()
,我有:
@Override
protected void onStartLoading() {
if (mData != null) {
deliverResult(mData);
}
else{
forceLoad();
}
}
Run Code Online (Sandbox Code Playgroud)
包含SherlockListFragment
启动加载器onActivityCreated
:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new MyListAdapter(getActivity());
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
}
Run Code Online (Sandbox Code Playgroud)
并且:
@Override
public Loader<List<MyData>> onCreateLoader(int id, Bundle args) {
return new MyListLoader(getActivity());
}
Run Code Online (Sandbox Code Playgroud)
问题是在loadinBackground()
没有调用5次激活/导航到FragmentActivity之后.在onStartLoding
叫,还有forceLoad
,但仅此而已.没有例外,LogCat中没有任何内容.
有任何想法吗?
我试图了解AsyncTaskLoaders的一些细节.对于其他人来说,这可能是显而易见的,但我无法找到一个明确的示例或定义来演示和夸大当您覆盖该deliverResult()
方法时会发生什么.实际交付的是什么?它如何与调用对象交互?我可以看到使用super.deliverResult
,它从类中传递一个私有对象.那么,加载器是否自动知道与"交付结果"相关联的内容.我完全糊涂了.
android ×10
asynctaskloader ×10
loader ×2
difference ×1
progress-bar ×1
robolectric ×1
unit-testing ×1