设备旋转时,Loader mListener(LoaderInfo)为null

时间:2014-11-17 08:34:26

标签: android android-sqlite loader

我的应用程序使用AsyncTaskLoader从数据库进行查询和加载。用户可以按类别过滤数据。没有设备旋转时它可以正常工作,但是在设备方向改变后,Loader不会加载按类别过滤的任何数据。

我的代码是:

//In activity oncreate
getSupportLoaderManager().initLoader (0, null, controller);

关于用户过滤操作,我打电话:

loader.onCententChanged();

我在上面的行中设置了一个断点,并指出在加载器实例中,它的mListener为NULL,因此调用onCententChanged()不会传递结果。如果我们不旋转设备,mListener不是NULL。

有人有这个问题吗?请帮忙!

修改

很抱歉迟到的回复,我没有看到来自Stackoverflow推送的任何电子邮件,我会检查我的设置。

顺便说一句,我的应用程序使用MVC模式,控制器用于处理数据加载,事件监听器,操作。在这种情况下,控制器实现LoaderManager.LoaderCallbacks。 当我调试它时,设置断点并查看发生了什么,我看到Loader类的mListener成员在纵向模式下首次加载时不为空,但是当我将设备转为横向模式时,mListener为NULL,因此回调不打电话。请参阅附加图像。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_latest_topics_layout);

    // Omitted code

    getSupportLoaderManager().initLoader (0, null, controller);
}

当用户过滤器选择数据过滤器时:

new AlertDialog.Builder(mContext)
            .setTitle("Choose a filter")
            .setSingleChoiceItems(R.array.latest_episodes_filter_titles, mFilter, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ListView listView = ((AlertDialog)dialog).getListView();
                    mFilter = listView.getCheckedItemPosition();

                    mListHandler.getLoader().onContentChanged();

                    dialog.dismiss();
                }
            })
            .setNegativeButton("Cancel", null).show();

调试:首次加载纵向/横向时

first time load

调试:旋转设备时

then rotate device

1 个答案:

答案 0 :(得分:0)

请尝试按以下方式初始化加载程序。可能它可以帮到你。

//In activity oncreate
if (getSupportLoaderManager().getLoader(0) == null) {
    getSupportLoaderManager().initLoader(0, new Bundle(), this);
} else {
    getSupportLoaderManager().restartLoader(0, new Bundle(), this);
}