我的代码有一个Activity,它有一个FragmentPagerAdapter,可以根据需要创建'n'个片段.Activity有一个加载器,每个片段都有自己的加载器.所有装载机都有唯一的ID.(Activity的加载器实际上决定了适配器中的Pages数)
我一直在这里和那里得到这个警告,不能指责导致它的原因.它似乎并不重要,也看着LoaderManger的代码抛出这个警告,但仍然 - 警告通常是错误的迹象..
最初使用FragmentStatePagerAdapter然后移动到FragmentPagerAdapter,认为这可能是某种程度上的问题 - 但显然不是.
发布代码会使这一点变得复杂并且添加很少.
有什么想法吗?
给定一个使用加载器从数据库加载(大量)数据的片段.
问题:
我有一个寻呼机适配器,当用户离开拿着它的标签时会破坏该片段,并在用户返回该标签时重新创建它.由于这种重新创建,每次都会创建一个新的加载器,并且每次都会加载数据.
题 :
为了避免每次创建片段时重新创建加载器,是否可以在片段getActivity.getSupportLoaderManager.initLoader(loaderId, null, false)的onActivityCreated方法中使用?
我试过它,测试它,似乎工作正常.但我不相信这是对的.
我的AsyncTaskLoader遇到了一些问题,不确定它们是否相关,因为它们在尝试重新启动Loader时都会发生.在我的应用程序中,我有3个自定义CursorAdapter实例,由3个由1个singleton LoaderManager管理的自定义AsyncTaskLoader实例支持.这些问题与两个不同的Adapter/Loader对有关,但在每种情况下使用的代码都是相同的:
getLoaderManager().restartLoader(loaderId, bundle, loaderManager);
Run Code Online (Sandbox Code Playgroud)
问题1:我调用restartLoader()并且LoaderManager注册了对onCreateLoader的调用,但没有注册到onLoaderReset().Loader获取deliverResult(),但永远不会调用onLoadFinished().Loader既没有设置'reset'或'started'标志(参见下面的代码).
问题2:我调用restartLoader()并且LoaderManager注册了对onLoaderReset()的调用.Loader获取onReset(),但没有进一步.Cursor设置为null,但没有加载新的Cursor.
任何想法可能是什么问题?以下是Loader和Loader Manager的一些代码:
CustomCursorLoader.java
@Override
protected void onStartLoading() {
Log.v(TAG, "Starting Loader");
if (lastCursor != null) {
deliverResult(lastCursor);
}
if (takeContentChanged() || lastCursor == null) {
forceLoad();
}
}
@Override
public void deliverResult(Cursor cursor) {
Log.v(TAG, "Delivering result");
if (isReset()) {
Log.v(TAG, "reset");
if (cursor != null) {
cursor.close();
}
return;
}
Cursor oldCursor = lastCursor;
lastCursor = cursor;
if (isStarted()) {
Log.v(TAG, "started");
super.deliverResult(cursor);
}
if (oldCursor != null && oldCursor != cursor …Run Code Online (Sandbox Code Playgroud) 所以我希望为所有应用程序活动都有一个数据库实例.我找到了以下代码:
public class MyApplication extends Application {
private static SQLiteDatabase mDB = null;
@Override
public void onCreate() {
super.onCreate();
DataBaseOpenHelper m_OpenHelper = new DataBaseOpenHelper( this );
mDB = m_OpenHelper.getWritableDatabase();
}
public static SQLiteDatabase getDB() {
return mDB;
}
}
Run Code Online (Sandbox Code Playgroud)
我什么时候可以关闭SQLiteDatabase实例,我不明白.
为了在我的应用程序中实现数据库访问,我遵循了Lars Vogel教程,但我对一些事情感到很困惑......
1)每次调用fetchTodo新游标时都会创建并返回.将前一个光标留给垃圾收集器.所以,如果我不使用startManagingCursor甚至CursorLoader就此而言,.close()当我完成它时,我应该在光标上调用吗?fetchTodo当然,在范围之外,例如:
Cursor cursor = mNotesAdapter.fetchTodo();
// do something...
cursor.close();
Run Code Online (Sandbox Code Playgroud)
我已经完成了这个游标,并且将在下一次获取时创建新游标,如果我这样关闭它还是应该将它留给垃圾收集器?虽然我认为我在谈论两件完全不同的事情......重点是,我应该像上面的例子那样关闭它吗?
2) Cursor也有一个.deactivate()方法,文档说它使用较少的资源(比活动游标).我什么时候应该使用它?例如,在我的应用程序中,我有一个ListActivity通过a填充SimpleCursorAdapter(代码初始化只调用一次).正在使用的游标是一个类成员变量,因为我需要在填充列表的方法之外.当从中删除某些内容时,我需要它来重新查询数据库.但是,除非删除记录,这是用户操作并且可能需要一段时间才会发生,我应该在此期间停用光标吗?因为当我.requery()再次打电话时它会再次激活.或者SimpleCursorAdapter由于光标不活动而停止工作?
编辑:我刚测试了这个,发现deactivate()在设置光标适配器后我无法调用.如果光标未激活,则列表将为空,因此只要显示ListActivity,它就需要保持活动状态.最后,我们应该让它StartManagingCursor处理它.或新的CursorLoader.
3)我知道startManagingCursor/ stopManagingCursor已被弃用但我不是针对Honeycomb(至少目前为止)并且我现在不想处理新CursorLoader的.但是在上面的教程中,startManagingCursor无处不在,但stopManagingCursor从未调用过一次.为什么不?Android会以自己的方式处理吗?我应该打电话的任何情况stopManagingCursor?
我的片段中有以下自己的接口实现:
@Override
public void onReportChanged(Fragment sender, long id, int position) {
// Views ein und ausblenden
_List.setVisibility(View.GONE);
_OnLoading.setVisibility(View.VISIBLE);
_NoDataView.setVisibility(View.GONE);
_ReportId = id;
getLoaderManager().restartLoader(_LM_REPORTS, null, this);
};
Run Code Online (Sandbox Code Playgroud)
FragmentActivity向此片段报告,另一个片段(选择列表)已选择一个项目.之后,ListFragment应加载具有报告ID(_ReportId)的新数据.
但是NullPoinerException在进入onCreateLoader-Method之前我会使用这段代码.这是LogCat:
05-28 14:24:37.905: E/AndroidRuntime(1775): FATAL EXCEPTION: main
05-28 14:24:37.905: E/AndroidRuntime(1775): java.lang.NullPointerException
05-28 14:24:37.905: E/AndroidRuntime(1775): at android.support.v4.app.LoaderManagerImpl.restartLoader(LoaderManager.java:637)
05-28 14:24:37.905: E/AndroidRuntime(1775): at de.webducer.android.worktime.beta.ui.fragment.ReportListFragment.onReportChanged(ReportListFra gment.java:142)
05-28 14:24:37.905: E/AndroidRuntime(1775): at de.webducer.android.worktime.beta.ui.ReportListActivity.onReportSelected(ReportListActivity.java:97)
05-28 14:24:37.905: E/AndroidRuntime(1775): at de.webducer.android.worktime.beta.ui.fragment.ReportSelectorSpinnerFragment$1.onItemSelected(ReportSelectorSpinnerFragment.java:78)
05-28 14:24:37.905: E/AndroidRuntime(1775): at android.widget.AdapterView.fireOnSelected(AdapterView.java:882)
05-28 14:24:37.905: E/AndroidRuntime(1775): at android.widget.AdapterView.access$200(AdapterView.java:48)
05-28 14:24:37.905: E/AndroidRuntime(1775): at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:848)
05-28 14:24:37.905: E/AndroidRuntime(1775): at …Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,允许人们为他们需要做的各种任务设置警报.我目前的计划是将所有相关数据存储到SQLite数据库中.为此,我创建了一个扩展SQLiteOpenHelper的类,并使用方法填充它以处理我期望必须接受的所有CRUD.知道在一个线程上执行所有处理通常是个坏主意,查找了在线程之间分离工作的方法,并找到了CursorLoader和LoaderManager,这看起来很理想,因为它们在Android兼容性库中可用.但是,LoaderManager似乎需要ContentProvider 按照文档中的教程进行操作,而我还没有真正看到需要对ContentProviders做任何事情,因为我没有计划允许其他应用程序访问数据.没有ContentProvider,我不知道我应该如何为我的数据库提供一个Uri来提供给CursorLoader.有没有办法让我继续使用我的类扩展SQLiteOpenHelper并仍然实现LoaderManager,以允许我将所有填充的ListFragments与我的光标关闭UI线程?
sqlite android sqliteopenhelper android-loadermanager android-cursorloader
我想到使用CursorLoaders和Loadermanagers的一个好处是你不需要手动管理游标的生命周期.所以我使用loadermanager使用支持包将适配器绑定到AutoCompleteTextView.
它工作得很好,除了它随机抛出一个错误,说"IllegalStateException - 尝试重新打开已经关闭的对象".当然,如果我们使用装载程序管理器,那不应该发生吗?
这是代码:
package com.bhagwad.tennis;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import com.bhagwad.tennis.TennisSchedule.TennisScheduleColumns;
public class WidgetConfiguration extends FragmentActivity implements OnClickListener, LoaderCallbacks<Cursor> {
Button mSaveWidget;
AutoCompleteTextView mPlayerName;
int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
String mSelection ="";
SimpleCursorAdapter mAdapter;
public static String PREFS = "com.bhagwad.tennis.appwidget";
public static final String PREFS_PREFIX_KEY = "prefix_";
@Override
protected void onCreate(Bundle …Run Code Online (Sandbox Code Playgroud) android autocompletetextview android-loadermanager android-cursorloader
我有一个Fragment实现LoaderManager并使用CursorLoader(没什么特别的).我想捕获查询期间抛出的异常,但我不知道如何!有帮助吗?谢谢.
android exception-handling android-loadermanager android-cursorloader
在配置更改后重新创建时,它们会自动重新连接到最后一个加载器的光标.因此,他们不需要重新查询他们的数据.
在这篇关于装载机的博客文章中,
当一个Activity被销毁时,Activity指示它的LoaderManager销毁并关闭它的Loaders(以及与它们相关的任何资源,比如Cursor).
问题是哪一个是正确的?当一个活动因配置更改而被销毁时,(1)其Loaders(2)与其Loaders关联的资源(例如a)会发生什么Cursor.
android android-configchanges android-activity android-loadermanager android-loader