我正试图弄清楚如何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
3.0我们得到了花哨的LoaderManager
,使用它处理数据加载AsyncTaskLoader
中,CursorLoader
和其他自定义Loader
实例.但是通过这些文档来阅读这些我无法理解这一点:这些比仅仅使用旧AsyncTask
的数据加载更好吗?
android android-asynctask android-loadermanager android-cursorloader
试图更新我的旧应用程序,其中不推荐使用某些方法.我发现如果我想使用显示来自db的数据的ListView,我应该使用LoaderManager + CursorLoader.CursorLoader与内容提供程序一起使用.那么对于我的db中的每个表,我现在应该创建内容提供者?我为什么要 ?据我所知,内容提供商用于与其他应用程序共享一些数据库信息,但我的应用程序不共享任何信息.那么我可以在没有内容提供者的情况下使用CursorLoader吗?
我目前正在尝试学习如何使用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)
任何人都可以帮我解决问题吗?
我有一个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
所以我有我的MainDisplayActivity
两个Activity
和LoaderManager.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
我Cursors
在我的应用程序中广泛使用,加载并偶尔从数据库写入信息.我已经看到Honeycomb和兼容包有新的Loader
类,旨在帮助以"良好"的方式加载数据.
从本质上讲,这些新类(特别是CursorLoader
)比以前的数据管理方法要好得多吗?例如,CursorLoader
过度管理有什么好处Cursors
?
我使用a ContentProvider
处理数据,这显然需要Uris
但是如何与initLoader()
方法相结合?我必须设置每个Fragments
人单独使用装载机吗?并且每个加载器的id需要多么独特,它是在我的应用程序范围内还是仅仅是一个片段?有没有简单的方法简单地传递Uri
给CursorLoader来查询我的数据?
我现在所能看到的是,Loaders添加了一个不必要的额外步骤来将我的数据导入我的应用程序,那么有人可以更好地向我解释它们吗?
我正在尝试使用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
我一直在研究一个小的待办事项列表应用程序.我使用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) 我正在浏览一些代码,我意识到我实际上并不知道如何使用连接CursorLoader
和LoaderManager
组合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