当前位置: 首页 > 知识库问答 >
问题:

从片段内的AsyncTask重新启动Loader(SQLite)时的IllegalStateException

汪弘光
2023-03-14
public class MyListFragment extends ListFragment 
    implements LoaderManager.LoaderCallbacks<Cursor> {

    Fragment fragment = this;
    SimpleCursorAdapter adapter;

    // onActivityCreated initializes the adapter and the loader

    public AsyncTaskLoader<Cursor> onCreateloader(int id, Bundle bundle) {
        return new CustomCursorLoader(this);
    }

    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        adapter.swapCursor(data);
    }

    public void onLoaderReset(Loader<Cursor> loader) {
        adapter.swapCursor(null);
    }

    private class CustomCursorLoader extends CursorLoader {
        public CustomCursorLoader(Fragment fragment) {
            // get a handle to the OrmLite database helper class
            databaseHelper = (DatabaseHelper) OpenHelperManager.getHelper(fragment.getActivity(), DatabaseHelper.class);
        }

        public Cursor loadInBackground() {
            // construct the Cursor that will be used for loading results from the SQLite database
        }
    }

    private class Task extends AsyncTask {
        // pre execute

        // grab some new database results from the server and repopulate the SQLite database using OrmLite

        public void onPostExecute() {
            fragment.getLoaderManager().restartLoader(LOADER_ID, null, fragment);
        }
    }
}

更新3

我想知道,就像Robby Pond在评论中提到的那样,在这里使用加载器是否是矫枉过正?

共有1个答案

壤驷德寿
2023-03-14

我对你的案子的一些想法:

>

  • 加载程序有各种问题,特别是在与片段一起使用时。我可以建议您使用ViewModel,但我认为它们都基于相同的代码。您可以使用一个普通的线程,然后使用EventBus之类的东西来发布结果,但这可能有点过头了

    我可以看到您忘记将类设置为静态,这意味着它们有一个对宿主类的引用。

    您可以在这里尝试使用AsyncTaskLoader的通用解决方案。

    也许不是重新启动,而是先销毁,然后再次调用initLoader。

    AsyncTask应该只在一些小的情况下使用,在这些情况下,您不关心结果是否消失(例如,当您改变方向时)。一个很好的例子是要显示的项列表。

  •  类似资料:
    • 我有3个碎片。 每个片段都有自己的AsyncTask。 当我“启动”FragmentActivity时,将显示片段1,并执行其asynctask。但是它最近的片段(片段2,中间的片段)也启动它的AsyncTask。 我想知道是否只有当用户看到片段时才可以启动异步任务。我想如果是可能的,因为我想显示一个进度对话框(获取数据...)。现在我从数据库中得到的数据很少,但如果我有很多,我想显示一个进度对话

    • 我的想法是,我启动一个异步任务,从Tweeter获取状态...在这里之前一切正常...但是当我遇到一些特定的tweets时,我需要用服务器上的一些信息来修改它们,这里我将进行另一个网络操作,因为我需要等待,直到我从服务器上获取信息,我做: 这是从doInBackground()方法中的allready启动的AsyncTask启动的... 我知道我可以在AsyncTask中添加方法并在doInBac

    • 我的的一个有一个奇怪的问题。我有一个,里面有三个。到现在为止一切正常。当应用程序启动时,(带有)附加了三个片段,这样我就可以毫无问题地从一个浏览到另一个。当我尝试像这样手动(注销后)重新启动应用程序时,问题就来了: 现在,当我注销和应用程序重新启动时,应用程序崩溃,并通过一个试图从片段上访问资源。 下面是我附加的代码,即: 然后,设置:

    • 我尝试使用onTabSelected来检测某个片段何时被选中,然后在接口的帮助下从该片段启动一个方法(下面的代码)。 但是,当使用Start方法时,在尝试更新TextView时会激发NullPointerException。start方法的代码是: 在以下行抛出异常: 是的,我已经在网上查过了所有可用的东西,但似乎没有任何东西对我有用。 非常感谢您的帮助!

    • 我读了DialogFragment,然后把它做成这样的一对一。 在另一个SherlockFragment中,我接下来制作: 但是doPositiveClick()、doNegativeClick()方法希望是静态的,这对我来说不好。

    • 我的Android应用程序有问题,我正在使用Android StudioIDE进行开发。差不多是当我把应用程序放在后台几分钟,或者被系统杀死,或者我混合了片段的不同布局时。我在下面放了一张图片: 如果你有其他人也写的话,我已经尝试了各种方法。提前谢谢你。