我试图了解loadermanager做了什么.任何人都可以与它共享一个例子吗?我创建游标时必须使用它们吗?如果不是我应该如何使用?非常感谢一个简单的例子.
android android-cursor android-loadermanager android-cursorloader
我正在使用Fragments和LoaderManager.我必须启动未知数量的任务,它们可能并行运行(否则我只重用一个且只有一个加载器).例如,我有一个listview,每行可能有一个按钮,用于将该行的内容保存到Web服务器.用户可以并行地对多个项目发起保存请求.
private int nextId = 0;
private void onClickListener() {
Bundle bundle = new Bundle();
bundle.putNextData(...);
getLoaderManager().initLoader(nextId++, bundle, this);
}
Run Code Online (Sandbox Code Playgroud)
我自己可以尝试簿记,所以手动创建一个加载器池并在可能的情况下重用它们,看起来它可能已经由API实现了?
谢谢
我正在阅读文档,但我仍然不太确定.它说要使用getContentResolver(),但那时确实没有使用CursorLoader.那么有办法实现CursorLoader吗?我知道如何做到这一点query().步骤非常相似吗?即使只是一个可以解释这一点的链接也会有所帮助.
请注意,请勿将我链接到Google文档,因为他们没有使用insert()ContentProvider使用方法的示例CursorLoader.
提前致谢!!
编辑:我应该提到我与此混淆的原因是因为调用一个新的CursorLoader自动调用ContentProviders query()方法.但是如何才能为插入做同样的事情呢?
android android-contentresolver android-contentprovider android-loadermanager android-cursorloader
我目前正在大量修改/重写一个Android应用程序,我看到一个非常偶然的崩溃沿着以下几行:一个CursorAdapter方法被调用,它调用AbstractWindowedCursor#checkPosition(),和:
02-20 15:03:18.180 E/AndroidRuntime(17143): android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method.
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:139)
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.CursorWrapper.getLong(CursorWrapper.java:106)
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.widget.CursorAdapter.getItemId(CursorAdapter.java:220)
Run Code Online (Sandbox Code Playgroud)
麻烦的是,我们没有关闭任何Cursors.我们所有的Cursors都来自CursorLoaders而且又是由a产生的ContentProvider.我们要传递Cursor到每个相应的CursorAdapter从LoaderCallbacks,我们正在注册Cursor中的通知ContentProvider,我们通知了ContentResolver从各insert(...),delete(...)和update(...)......总之我找不到任何理由为什么Cursor会在使用中关闭一段时间.
那么:a 的其他原因是 …
android staledataexception android-contentprovider android-loadermanager android-loader
我对装载机有一个奇怪的问题.目前我不确定这是否是我的代码中的错误或我误解了加载器.
该应用程序
问题出现在对话中(想象类似于Whatsapp的东西).我使用的加载器是基于AsyncTaskLoader示例实现的.我正在使用支持库.
这非常有效,但有以下例外.
问题
当我打开另一个片段(并将事务添加到backstack)然后使用Back-Key返回conversationFragment时,onLoadFinished再次使用之前的两个结果调用.此调用发生在片段有机会再次启动加载器之前...
我之前获得的"旧"结果的传递导致重复的消息.
题
堆栈跟踪的电话
MyFragment.onLoadFinished(Loader, Result) line: 369
MyFragment.onLoadFinished(Loader, Object) line: 1
LoaderManagerImpl$LoaderInfo.callOnLoadFinished(Loader, Object) line: 427
LoaderManagerImpl$LoaderInfo.reportStart() line: 307
LoaderManagerImpl.doReportStart() line: 768
MyFragment(Fragment).performStart() line: 1511
FragmentManagerImpl.moveToState(Fragment, int, int, int, boolean) line: 957
FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1104
BackStackRecord.popFromBackStack(boolean) line: 764
...
Run Code Online (Sandbox Code Playgroud)
更新1 此处提到的加载器由对话片段启动:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
Bundle args = getArguments();
m_profileId = args.getString(ArgumentConstants.ARG_USERID);
m_adapter = new MessageAdapter(this); …Run Code Online (Sandbox Code Playgroud) 在Android中使用LoaderManager API加载相关查询的首选方法是什么?截至目前,我能想出的最好的东西是:
@Override
public void onCreate( Bundle savedInstanceState ) {
getLoaderManager().initLoader( FIRST, null, this );
}
@Override
public void onLoadFinished( Loader<Cursor> loader, Cursor data ) {
switch ( loader.getId() ) {
case FIRST:
Bundle args = new Bundle();
args.putInt( ID, somethingFromData( data ) );
getLoaderManager().restartLoader( SECOND, args, this );
break;
case SECOND:
somethingElseFromData( data );
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这大部分时间都可以正常工作,但在一个特殊情况下崩溃可怕.假设我启动了第二个活动或在此基础上推送一个修改数据的片段FIRST.现在,当我导航回到与它上面的代码中的活动/片的第一刷新我的旧数据FIRST和SECOND,自FIRST发起SECOND,SECOND与新的数据加载.现在自FIRST更改后再次加载,这会导致另一个负载SECOND启动.
首先,如果你计算总计两个负载FIRST(一个旧的和一个新的)和三个负载SECOND(两个旧的和一个新的),这至少有点浪费.我真的不介意,除了调试很麻烦,但在我看来它也表现得不确定,因为你不知道哪些负载会先完成. …
Android兼容包据说支持LoaderManager.如何获取LoaderManager的实例?FragmentActivity中缺少getLoaderManager()方法,它仅在Fragment类中.但我想在我的应用程序中只使用加载程序,而不是碎片.
我试图AlphabetIndexer用这样的自定义适配器实现
我的类ContactsCursorAdapter扩展SimpleCursorAdapter和实现SectionIndexer
,我使用a LoaderManager来管理我的适配器的光标,所以我已经覆盖了swapCursor()方法,就像上面示例的第二个答案所示.
public class ContactsCursorAdapter extends SimpleCursorAdapter
implements SectionIndexer{
private LayoutInflater mInflater;
private Context mContext;
private AlphabetIndexer mAlphaIndexer;
public ContactsCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
mInflater = LayoutInflater.from(context);
mContext = context;
}
public View getView(final int position, View convertView, ViewGroup parent) {
...
}
@Override
public int getPositionForSection(int section) {
return mAlphaIndexer.getPositionForSection(section);
}
@Override
public int getSectionForPosition(int position) { …Run Code Online (Sandbox Code Playgroud) android adapter simplecursoradapter android-loadermanager android-cursorloader
我在我的应用程序中实现了一个Loader来查询数据库中的数据.我通过实现LoaderCallbacks<Cursor>监听器来监听发生的变化.我遇到的问题是当onLoaderReset(Loader<Cursor> loader)我的数据发生变化时使用该方法,并且我想要使与加载器相关的任何数据无效并释放.在所有示例中,在此方法中有以下调用:
mAdapter.swapCursor(null);
但问题是我不使用适配器中光标的数据,我在我的应用程序中以其他方式使用它.
(onLoadFinished(Loader<Cursor> loader, Cursor data)例如,直接从返回的游标中)
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (data.moveToFirst()) {
TOTAL_CARDS = data.getCount();
mView.createCards(TOTAL_CARDS);
} else {
TOTAL_CARDS = 0;
mView.createCards(TOTAL_CARDS);
}
}
Run Code Online (Sandbox Code Playgroud)
这里要做的相应事情是什么,与...类似mAdapter.swapCursor.我对装载机没有多少经验,事实上我刚开始与他们合作,所以如果有人有解决方案,我会很感激.谢谢!
编辑:现在,我传递null到加载器,它的工作原理如下:
@Override
public void onLoaderReset(Loader<Cursor> loader) {
loader = null;
}
};
Run Code Online (Sandbox Code Playgroud)
但这是正确的解决方案吗?
我有一个ContentProvider,它有两个表1. OnlineContacts2 AllContacts.然后我有一个方法,我查询两个表并分别得到他们的结果cursors.然后使用并列出一个列表加入他们.将此列表传递给我,我正在填充我的.喜欢 :CursorJoinerContactsCustomAdapter extending BaseAdapterlistview
public static List<Contact> getContacts(Context context){
List<Contact> contactList = new ArrayList<Contact>();
// Getting First Cursor
String URL = xyz;
Uri baseUri1 = Uri.parse(URL);
String[] select = xyz;
String where =xyz;
Cursor cursor = context.getContentResolver().query(baseUri1, select, where, null, "pid");
// Getting 2nd Cursor
Uri baseUri = xyz;
String[] projection =xyz;
String selection =xyz;
String[] selectionArgs = null;
String sortOrder = xyz;
Cursor mCursor= context.getContentResolver().query(baseUri, …Run Code Online (Sandbox Code Playgroud)