java - 长时间不活动后无法创建新的加载程序

标签 java android android-fragments android-loadermanager android-loader

我有一个 Android 应用程序,其 Fragment 依赖加载器来获取数据。下面是我的 Fragment 的骨架代码。一切都是一样的,除了我在 onLoadFinished 方法中有一些自定义代码。

public class Events extends Fragment implements LoaderCallbacks<ArrayList<Event>> {    
    private Integer intWeek;

    public static Events newInstance(Integer intWeek) {    
        Events pageFragment = new Events();
        pageFragment.intWeek = intWeek;
        pageFragment.setArguments(new Bundle());
        return pageFragment;    
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.events, null);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLoaderManager().initLoader(this.intWeek, savedInstanceState, this);
    }

    public Loader<ArrayList<Event>> onCreateLoader(int intLoader, Bundle bndBundle) {
        return new Scraper(getActivity().getApplicationContext());
    }

    public void onLoadFinished(Loader<ArrayList<Event>> ldrEvents, final ArrayList<Event> lstEvents) {    
        //Do something with the returned data
    }

    public void onLoaderReset(Loader<ArrayList<Event>> ldrEvents) {
        return;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }    
}

FragmentFragmentActivity内部使用,该FragmentActivity使用ViewPager,后者使用FragmentPagerAdapter获取其Fragment `.

这工作正常,我可以在 Fragment 之间进行分页,如上所示。每次将新的 Fragment 添加到 ViewPager 时,都会触发 onCreate 方法并创建一个新的 Loader

当我按手机上的“主页”按钮时,应用程序会暂停并进入后台。我始终可以恢复应用程序,并且在后台运行 5/10/20 分钟后它工作得很好。

...但是如果我将应用程序留在后台很长时间(一个小时或更长时间),应用程序将在启动时崩溃,并且堆栈跟踪指向 onCreate 方法中的以下行:

        getLoaderManager().initLoader(this.intWeek, savedInstanceState, this);

现在我很困惑为什么会发生这种情况。看来 Android 框架在后台长时间不活动后会破坏后台的某些内容,并且 initLoader 方法无法创建 Loaderdocumentation about the initLoader method具体说:

Ensures a loader is initialized and active. If the loader doesn't already exist, one is created and (if the activity/fragment is currently started) starts the loader. Otherwise the last created loader is re-used.

有人能指出我在这里做错了什么吗?这似乎是一个很难调试的问题,因为我无法随意复制它。这是非常随机的。谢谢

<小时/>

来自 logcat 的堆栈跟踪:

Transmitting stack trace: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mridang.stadi/com.mridang.stadi.Main}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2079)    
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)    
    at android.app.ActivityThread.access$600(ActivityThread.java:132)    
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1157)    
    at android.os.Handler.dispatchMessage(Handler.java:99)    
    at android.os.Looper.loop(Looper.java:137)    
    at android.app.ActivityThread.main(ActivityThread.java:4575)    
    at java.lang.reflect.Method.invokeNative(Native Method)    
    at java.lang.reflect.Method.invoke(Method.java:511)    
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)    
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)    
    at dalvik.system.NativeStart.main(Native Method)    
Caused by: java.lang.NullPointerException    
    at com.mridang.stadi.events.Events.onCreate(Events.java:73)    
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:834)    
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)    
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)    
    at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1805)    
    at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:200)    
    at com.mridang.stadi.Main.onCreate(Main.java:23)    
    at android.app.Activity.performCreate(Activity.java:4465)    
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)    
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2033)    
    ... 11 more

最佳答案

我在装载机上遇到了类似的问题。我发现 Fragment/Loader 的生命周期很复杂。我很想找到一份详细解释它的文档。

无论如何,我为解决该问题所做的是将 initLoader() 调用移至 onActivityCreated() 方法。尝试一下。

关于java - 长时间不活动后无法创建新的加载程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13154425/

相关文章:

android - finishActivity() 的可能用例是什么

java - servlet - 许多上下文 - 如何共享数据库连接?

c# - python/C++/C#/Java 中两个句子之间的相关性?

android - registerReceiver 中需要表达式 - Android Studio

java - Android 布局 xml 旋转方向

android - 这些值对 CallLog.Calls.CACHED_NUMBER_TYPE 字段意味着什么?

android - fragment 工具栏中的向上导航

java - fragment 到 Activity 动画不适用于 overridePendingTransition();

java - 将字符串拆分为已定义的数组

java - jsf 1.2 验证并关闭后弹出窗口不上传新数据