标签: android-loadermanager

LoaderManager做什么?

我试图了解loadermanager做了什么.任何人都可以与它共享一个例子吗?我创建游标时必须使用它们吗?如果不是我应该如何使用?非常感谢一个简单的例子.

android android-cursor android-loadermanager android-cursorloader

12
推荐指数
1
解决办法
5756
查看次数

使用LoaderManager的多个装载程序的模式?

我正在使用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实现了?

谢谢

android android-loadermanager

12
推荐指数
1
解决办法
1820
查看次数

如何使用ContentProvider的insert()方法通过CursorLoader将值正确插入到SQLite数据库中?

我正在阅读文档,但我仍然不太确定.它说要使用getContentResolver(),但那时确实没有使用CursorLoader.那么有办法实现CursorLoader吗?我知道如何做到这一点query().步骤非常相似吗?即使只是一个可以解释这一点的链接也会有所帮助.

请注意,请勿将我链接到Google文档,因为他们没有使用insert()ContentProvider使用方法的示例CursorLoader.

提前致谢!!

编辑:我应该提到我与此混淆的原因是因为调用一个新的CursorLoader自动调用ContentProviders query()方法.但是如何才能为插入做同样的事情呢?

android android-contentresolver android-contentprovider android-loadermanager android-cursorloader

12
推荐指数
1
解决办法
2万
查看次数

什么可能导致StaleDataException而不是过早地调用cursor.close()?

我目前正在大量修改/重写一个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到每个相应的CursorAdapterLoaderCallbacks,我们正在注册Cursor中的通知ContentProvider,我们通知ContentResolver从各insert(...),delete(...)update(...)......总之我找不到任何理由为什么Cursor会在使用中关闭一段时间.

那么:a 的其他原因是 …

android staledataexception android-contentprovider android-loadermanager android-loader

12
推荐指数
1
解决办法
1012
查看次数

为什么在片段恢复后再次调用onLoadFinished?

我对装载机有一个奇怪的问题.目前我不确定这是否是我的代码中的错误或我误解了加载器.

该应用程序

问题出现在对话中(想象类似于Whatsapp的东西).我使用的加载器是基于AsyncTaskLoader示例实现的.我正在使用支持库.

  • 在OnCreate中,我启动一个加载器来检索缓存的消息.
  • 当CachedMessageLoader完成时,它启动RefreshLoader以检索(在线)最新消息.
  • 每个加载器类型作为不同的ID(例如,离线:1在线:2)

这非常有效,但有以下例外.

问题

当我打开另一个片段(并将事务添加到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 android-loadermanager android-loader

12
推荐指数
1
解决办法
6236
查看次数

使用LoaderManager加载相关查询的首选方法

在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.现在,当我导航回到与它上面的代码中的活动/片的第一刷新我的旧数据FIRSTSECOND,自FIRST发起SECOND,SECOND与新的数据加载.现在自FIRST更改后再次加载,这会导致另一个负载SECOND启动.

首先,如果你计算总计两个负载FIRST(一个旧的和一个新的)和三个负载SECOND(两个旧的和一个新的),这至少有点浪费.我真的不介意,除了调试很麻烦,但在我看来它也表现得不确定,因为你不知道哪些负载会先完成. …

android android-loadermanager

12
推荐指数
1
解决办法
182
查看次数

Android兼容包和getLoaderManager()

Android兼容包据说支持LoaderManager.如何获取LoaderManager的实例?FragmentActivity中缺少getLoaderManager()方法,它仅在Fragment类中.但我想在我的应用程序中只使用加载程序,而不是碎片.

android android-loadermanager

11
推荐指数
1
解决办法
4572
查看次数

带有由LoaderManager管理的自定义适配器的AlphabetIndexer

我试图AlphabetIndexer用这样的自定义适配器实现

带自定义适配器的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

11
推荐指数
1
解决办法
1万
查看次数

Loaders和onLoaderReset Android

我在我的应用程序中实现了一个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)

但这是正确的解决方案吗?

android loader android-loadermanager

11
推荐指数
1
解决办法
1万
查看次数

如何在android中的LoaderManager中使用两个Cursors和CursorJoiner

我有一个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)

android android-loadermanager android-cursorloader

11
推荐指数
1
解决办法
5366
查看次数