标签: android-loadermanager

Android Honeycomb中的加载器

我正试图弄清楚如何Loaders在Android 3.0中使用,但似乎无法让它工作.文档只描述使用,CursorLoader但我正在使用AsyncTaskLoader.

从文档中看来,您应该只需要实现,AsyncTaskLoader.loadInBackground()但它永远不会被调用getLoaderManager().initLoader(),然后在回调中创建加载器.

我可以看到调试消息说它Created new loader LoaderInfo{4040a828 #0 : ArticleDataLoader{4036b350}}好像是成功创建的.

是否有可能在SDK中破坏了加载器,或者在创建加载器后是否需要调用某些方法?(他们在CursorLoader示例中没有这样做).

编辑:似乎调用forceLoad()返回的Loader initLoader()至少启动加载,但这意味着你无法正确处理旋转:(

android android-3.0-honeycomb android-loadermanager android-loader

36
推荐指数
1
解决办法
5732
查看次数

Android 3.0 - 使用LoaderManager实例的优势是什么?

3.0我们得到了花哨的LoaderManager,使用它处理数据加载AsyncTaskLoader中,CursorLoader和其他自定义Loader实例.但是通过这些文档来阅读这些我无法理解这一点:这些比仅仅使用旧AsyncTask的数据加载更好吗?

android android-asynctask android-loadermanager android-cursorloader

31
推荐指数
1
解决办法
8294
查看次数

Android:CursorLoader,LoaderManager,SQLite

试图更新我的旧应用程序,其中不推荐使用某些方法.我发现如果我想使用显示来自db的数据的ListView,我应该使用LoaderManager + CursorLoader.CursorLoader与内容提供程序一起使用.那么对于我的db中的每个表,我现在应该创建内容提供者?我为什么要 ?据我所知,内容提供商用于与其他应用程序共享一些数据库信息,但我的应用程序不共享任何信息.那么我可以在没有内容提供者的情况下使用CursorLoader吗?

java multithreading android android-loadermanager

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

在活动中初始化加载程序

我目前正在尝试学习如何使用Loaders,并且在我的活动中无法启动Loader.

import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;

public class ASwitchActivity extends Activity implements 
             LoaderManager.LoaderCallbacks<SampleLoader.SampleLoaderResult> {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        getLoaderManager().initLoader(0, null, this);
    }

    public Loader<SampleLoader.SampleLoaderResult> onCreateLoader(int id, Bundle args) {
      return new SampleLoader(getBaseContext(), account, "dog");
}

  public void onLoadFinished(Loader<SampleLoader.SampleLoaderResult> loader, SampleLoader.SampleLoaderResult out)
  {
      TextView t=(TextView)findViewById(R.id.testTV);
      t.setText("yay");
  }

  public void onLoaderReset(Loader<SampleLoader.SampleLoaderResult> loader){

  }
}   
Run Code Online (Sandbox Code Playgroud)

但是Eclipse给出了一个错误说明:

LoaderManager类型中的方法initLoader(int,Bundle,LoaderManager.LoaderCallbacks)不适用于参数(int,null,ActivitySwitchActivity)

任何人都可以帮我解决问题吗?

android android-loadermanager

28
推荐指数
2
解决办法
3万
查看次数

自定义CursorLoader和支持ListView的CursorAdapter之间的数据不同步

背景:

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

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

如何从CursorLoader刷新光标?

所以我有我的MainDisplayActivity两个ActivityLoaderManager.LoaderCallbacks<Cursor>.在这里,我有一个A ListView,我填写了我使用ContentProvider从我的数据库获得的议程信息.我也有GridView一个日历.我点击一个单元格时设置了它,在点击的那一天更新议程.我的问题是,当重用我在onCreate()setOnItemClickListener()内部创建的Loader时,它不会使用我正在创建的新游标刷新信息.我可以用另一个ID创建一个新的Loader,它可以运行一次,但是一旦我点击另一天,它就会停止刷新.问题在于光标.如何从Loader刷新游标,这样我就不必继续创建新的Loader?提前致谢!

初始调用在My MainDisplayActivity类中的onCreate()中创建Loader :

makeProviderBundle(new String[] {"_id, event_name, start_date, start_time, end_date, end_time, location"},
            "date(?) >= start_date and date(?) <= end_date", new String[]{getChosenDate(), getChosenDate()}, null);
    getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this);

    list.setAdapter(agendaAdapter);
Run Code Online (Sandbox Code Playgroud)

这些是被重写的方法 LoaderCallbacks<Cursor>

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    Uri baseUri = SmartCalProvider.CONTENT_URI;
    return new CursorLoader(this, baseUri, args.getStringArray("projection"), 
            args.getString("selection"), args.getStringArray("selectionArgs"), args.getBoolean("sortOrder") ? args.getString("sortOrder") : null );
}



@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
    agendaAdapter.swapCursor(arg1);
}



@Override …
Run Code Online (Sandbox Code Playgroud)

debugging android android-contentprovider android-loadermanager android-cursorloader

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

CursorLoaders有什么好处?

Cursors在我的应用程序中广泛使用,加载并偶尔从数据库写入信息.我已经看到Honeycomb和兼容包有新的Loader类,旨在帮助以"良好"的方式加载数据.

从本质上讲,这些新类(特别是CursorLoader)比以前的数据管理方法要好得多吗?例如,CursorLoader过度管理有什么好处Cursors

我使用a ContentProvider处理数据,这显然需要Uris但是如何与initLoader()方法相结合?我必须设置每个Fragments人单独使用装载机吗?并且每个加载器的id需要多么独特,它是在我的应用程序范围内还是仅仅是一个片段?有没有简单的方法简单地传递Uri给CursorLoader来查询我的数据?

我现在所能看到的是,Loaders添加了一个不必要的额外步骤来将我的数据导入我的应用程序,那么有人可以更好地向我解释它们吗?

android cursor android-3.0-honeycomb android-loadermanager

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

AsyncTaskLoader onLoadFinished,具有待处理任务和配置更改

我正在尝试使用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

24
推荐指数
1
解决办法
6468
查看次数

即使应用程序处于非活动状态,CursorLoader如何自动更新视图?

我一直在研究一个小的待办事项列表应用程序.我使用CursorLoader从内容提供者更新ToDolistview.我有一个函数onNewItemAdded(),当用户在文本视图中输入一个新项目并单击Enter时调用该函数.参考下文:

public void onNewItemAdded(String newItem) {
    ContentResolver cr = getContentResolver();

    ContentValues values = new ContentValues();
    values.put(ToDoContentProvider.KEY_TASK, newItem);

    cr.insert(ToDoContentProvider.CONTENT_URI, values);
    // getLoaderManager().restartLoader(0, null, this); // commented for the sake of testing
}

@Override
protected void onResume() {
    super.onResume();
    //getLoaderManager().restartLoader(0, null, this); // commented for the sake of testing
}

public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    CursorLoader loader = new CursorLoader(this,
            ToDoContentProvider.CONTENT_URI, null, null, null, null);
    Log.e("GOPAL", "In the onCreateLoader");
    return loader;
}

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) …
Run Code Online (Sandbox Code Playgroud)

android android-loadermanager android-cursorloader

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

带有LoaderManager的CursorLoader如何知道将光标发送到CursorAdapter?

我正在浏览一些代码,我意识到我实际上并不知道如何使用连接CursorLoaderLoaderManager组合CursorAdapter.这是我困惑的部分.

agendaAdapter = new MyAgendaAdapter(this, null);

makeProviderBundle(new String[] {"_id", "event_name", "start_date", "start_time",
    "end_date", "end_time", "location"}, "date(?) >= start_date and date(?) <= end_date", 
new String[]{getChosenDate(), getChosenDate()}, null);

getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this);
list.setAdapter(agendaAdapter);
Run Code Online (Sandbox Code Playgroud)

那么query()我的自定义方法如何ContentProvider将其发送到特定的方法CursorAdapter呢?我只是没有看到连接.我理解其他一切,但这个问题是什么.哦,我应该提一下,代码工作正常.

android android-contentprovider android-loadermanager android-cursorloader

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