android兼容包-片段。。。不依附于活动

android兼容包-片段。。。不依附于活动,android,android-fragments,android-loadermanager,Android,Android Fragments,Android Loadermanager,你好,, 我面临着这个问题: 我正在使用兼容包在android应用程序(MinSDK 2.1)中使用片段 片段上有时会出现随机异常,我不知道为什么。 这是我收到的堆栈跟踪: java.lang.IllegalStateException: Fragment FeedListFragment{438a54e8} not attached to Activity at android.support.v4.app.Fragment.getLoaderManager(Fragment.java

你好,, 我面临着这个问题: 我正在使用兼容包在android应用程序(MinSDK 2.1)中使用片段

片段上有时会出现随机异常,我不知道为什么。 这是我收到的堆栈跟踪:

java.lang.IllegalStateException: Fragment FeedListFragment{438a54e8} not attached to Activity
    at android.support.v4.app.Fragment.getLoaderManager(Fragment.java:715)
    at com.myappli.ui.FeedListFragment.refreshUpdateDate(FeedListFragment.java:283)
    at com.myappli.ui.phone.FeedListActivity.onReceiveResult(FeedListActivity.java:277)
    at com.myappli.data.rssplayer.service.KTDetachableResultReceiver.onReceiveResult(KTDetachableResultReceiver.java:55)
    at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:43)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:4425)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    at dalvik.system.NativeStart.main(Native Method)
下面是我在Fragment类中调用的相应代码:

public class FeedListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>, FeedListCursorAdapterListener {

...
    public void refreshUpdateDate() {
    getLoaderManager().restartLoader(LAST_UPDATE_CURSOR_ID, null, this);
    }
...
}
以下是getLoaderManager()的片段源代码:

以下是应用程序崩溃前的步骤:

  • 该活动在后台调用方法
  • 对活动调用回调方法
  • 在此回调方法中,活动调用片段
  • 该片段尝试启动一些需要活动的方法(如getLoadManager())
  • 片段不再附加到activity=>crash
  • 我们尝试了两种修复方法:

    • 对活动进行测试,以检查活动是否已完成(如上面的代码)
    • 用该方法对碎片进行了测试
    谢谢你的帮助


    如果我不清楚,请随时询问我更多信息。

    我也遇到过类似问题


    尝试使用
    isAdded()
    isVisible()
    而不是
    isDetached()
    。不幸的是,
    isDetached()
    似乎无法正常工作…

    我通过将内部适配器类更改为静态内部类解决了此问题

    private static class MessagesAdapter extends CursorAdapter {
    ...
    

    我不知道如何解释这一点,但这与我们应该避免使用推荐的非静态内部类这一事实有关

    对我有效的方法是使用片段的片段监听器,为它添加一个getActivity函数,返回片段监听器的活动(创建片段的活动)


    现在,当我有一个需要活动的调用时,我只使用函数。

    片段将附加到event fragment.onAttach(活动)上的活动。片段提供,您的活动必须实现一个侦听器。 为了确保只在事件发生后调用refreshUpdateDate()方法,onAttach()应首先将活动作为侦听器实现,然后调用侦听器fragmentAttached()方法。因此,当片段被附加并且可以调用refreshUpdateDate()时,您的活动将被通知,例如fragmentAttached()中的direct。
    请参阅。

    我将尝试您的解决方案,并尽快给您反馈。谢谢你的回答!非常棒的答案,检查isAdded()似乎解决了我的问题。这发生在我在Nexus7上快速更改方向时。在我的例子中,我在异步回调方法中调用startActivity时遇到问题。这个isAdded()调用至少有助于防止崩溃。永远不要引用后台线程中的片段或活动。例如,如果使用AsyncTask,请将字符串传递到任务的构造函数或execute()方法中。当异步任务返回的数据被添加到片段中时,就会发生崩溃,因为您的活动没有附加并崩溃
    /**
    * Return the LoaderManager for this fragment, creating it if needed.
    */
    public LoaderManager getLoaderManager() {
        if (mLoaderManager != null) {
            return mLoaderManager;
        }
        if (mActivity == null) {
            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
        }
        mCheckedForLoaderManager = true;
        mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, true);
        return mLoaderManager;
    }
    
    private static class MessagesAdapter extends CursorAdapter {
    ...