FragmentActivity空指针中的onCreate savedInstanceState捆绑 [英] FragmentActivity NullPointer in onCreate savedInstanceState Bundle

查看:129
本文介绍了FragmentActivity空指针中的onCreate savedInstanceState捆绑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我背景的应用程序,并在一段时间后恢复它,我收到下面的异常。
如果我改变方向或背景和恢复应用程序,马上(即的onSaveInstanceState 的onCreate 两次都被执行),那么在savedInstanceState包中包含了正确的ArrayList和一切工作正常。

  

02-05 14:42:06.254 E / AndroidRuntime(24355):   java.lang.RuntimeException的:无法启动的活动   ComponentInfo{com.savant.donordetailsviewpagertitle/com.savant.donordetailsviewpagertitle.activities.DonorDetailsContainerFragmentActivity}:   显示java.lang.NullPointerException:类型预计接收器   com.savant.donordetailsviewpagertitle.activities.DonorDetailsContainerFragmentActivity$RunningLoadersList,   但得到空

 私有类RunningLoadersList扩展的ArrayList< RunningLoader>器物
        Parcelable {

    私有静态最后长的serialVersionUID = 663585476779879096L;

    公共RunningLoadersList(){
    }

    @燮pressWarnings(未使用)
    公共RunningLoadersList(包裹中){
        本();
        readFromParcel(在);
    }

    私人无效readFromParcel(包裹中){

        this.clear();

        //首先我们要读列表的大小
        INT大小= in.readInt();

        的for(int i = 0; I<大小;我++){
            RunningLoader R =新RunningLoader(in.readInt()
                    in.readBundle());
            this.add(r)的;
        }
    }

    公众诠释describeContents(){
        返回0;
    }

    公众最终Parcelable.Creator< RunningLoadersList> CREATOR =新Parcelable.Creator< RunningLoadersList>(){
                                                                    公共RunningLoadersList createFromParcel(包裹中){
                                                                        返回新RunningLoadersList(中);
                                                                    }

                                                                    公共RunningLoadersList [] newArray(INT尺寸){
                                                                        返回新RunningLoadersList【尺寸】;
                                                                    }
                                                                };

    公共无效writeToParcel(包裹DEST,INT标志){
        INT大小= this.size();

        //我们必须写列表的大小,我们需要他重新名单
        dest.writeInt(大小);

        的for(int i = 0; I<大小;我++){
            RunningLoader R = this.get(ⅰ);

            dest.writeInt(r.id);
            dest.writeBundle(r.args);
        }
    }
}

静态final类RunningLoader {
    私人最终诠释ID;
    私人最终捆绑的args;

    RunningLoader(INT _id,捆绑_args){
        ID = _id;
        的args = _args;
    }
}



    @覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);

    //这具有的setContentView之前被调用,您必须使用
    //在android.support.v4.view类,而不是android.view
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

    的setContentView(R.layout.main);

    Log.d(LOG_TAG的onCreate);

    mAdapter =新ViewPagerTitleAdapter(getSupportFragmentManager());

    mPager =(ViewPager)findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

    TabPageIndicator指标=(TabPageIndicator)findViewById(R.id.tabindicator);
    indicator.setViewPager(mPager);

    //首先检查如果我们已经有一个正在运行的装载机
    如果((savedInstanceState!= NULL)
            &功放;&安培; savedInstanceState.containsKey(RUNNING_LOADERS)){
        mRunningLoaders = savedInstanceState.getParcelable(RUNNING_LOADERS);
    }

    如果(mRunningLoaders == NULL){
        mRunningLoaders =新RunningLoadersList();
    }

    如果(mRunningLoaders!= NULL){
        的for(int i = 0; I< mRunningLoaders.size();我++){
            StartLoader(mRunningLoaders.get(我).ID,
                    mRunningLoaders.get(ⅰ).args);
        }
    }

    如果(getSupportLoaderManager()。hasRunningLoaders()){
        setProgressBarIndeterminateVisibility(Boolean.TRUE);
    } 其他 {
        setProgressBarIndeterminateVisibility(Boolean.FALSE);
    }
}


    @覆盖
保护无效的onSaveInstanceState(包outState){
    super.onSaveInstanceState(outState);
    outState.putParcelable(RUNNING_LOADERS,mRunningLoaders);

    Log.d(LOG_TAG的onSaveInstanceState);
}
 

解决方案

Parcelable.Creator< RunningLoadersList>()必须静态像这样

 公共静态最终Parcelable.Creator< RunningLoadersList> CREATOR =
新Parcelable.Creator< RunningLoadersList>(){
...
...
。
}
 

If I background the app and resume it after a period of time I receive the following exception.
If I change orientation or background and resume the app straight away (the onSaveInstanceState and onCreate is executed on both occasions) then the savedInstanceState Bundle contains the correct ArrayList and everything works fine.

02-05 14:42:06.254 E/AndroidRuntime(24355): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.savant.donordetailsviewpagertitle/com.savant.donordetailsviewpagertitle.activities.DonorDetailsContainerFragmentActivity}: java.lang.NullPointerException: expected receiver of type com.savant.donordetailsviewpagertitle.activities.DonorDetailsContainerFragmentActivity$RunningLoadersList, but got null

    private class RunningLoadersList extends ArrayList<RunningLoader> implements
        Parcelable {

    private static final long   serialVersionUID    = 663585476779879096L;

    public RunningLoadersList() {
    }

    @SuppressWarnings("unused")
    public RunningLoadersList(Parcel in) {
        this();
        readFromParcel(in);
    }

    private void readFromParcel(Parcel in) {

        this.clear();

        // First we have to read the list size
        int size = in.readInt();

        for (int i = 0; i < size; i++) {
            RunningLoader r = new RunningLoader(in.readInt(),
                    in.readBundle());
            this.add(r);
        }
    }

    public int describeContents() {
        return 0;
    }

    public final Parcelable.Creator<RunningLoadersList> CREATOR = new Parcelable.Creator<RunningLoadersList>() {
                                                                    public RunningLoadersList createFromParcel(Parcel in) {
                                                                        return new RunningLoadersList(in);
                                                                    }

                                                                    public RunningLoadersList[] newArray(int size) {
                                                                        return new RunningLoadersList[size];
                                                                    }
                                                                };

    public void writeToParcel(Parcel dest, int flags) {
        int size = this.size();

        // We have to write the list size, we need him recreating the list
        dest.writeInt(size);

        for (int i = 0; i < size; i++) {
            RunningLoader r = this.get(i);

            dest.writeInt(r.id);
            dest.writeBundle(r.args);
        }
    }
}

static final class RunningLoader {
    private final int       id;
    private final Bundle    args;

    RunningLoader(int _id, Bundle _args) {
        id = _id;
        args = _args;
    }
}



    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // This has to be called before setContentView and you must use the
    // class in android.support.v4.view and NOT android.view
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

    setContentView(R.layout.main);

    Log.d(LOG_TAG, "onCreate");

    mAdapter = new ViewPagerTitleAdapter(getSupportFragmentManager());

    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

    TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.tabindicator);
    indicator.setViewPager(mPager);

    // first check if we already have a running loader
    if ((savedInstanceState != null)
            && savedInstanceState.containsKey("RUNNING_LOADERS")) {
        mRunningLoaders = savedInstanceState.getParcelable("RUNNING_LOADERS");
    }

    if (mRunningLoaders == null) {
        mRunningLoaders = new RunningLoadersList();
    }

    if (mRunningLoaders != null) {
        for (int i = 0; i < mRunningLoaders.size(); i++) {
            StartLoader(mRunningLoaders.get(i).id,
                    mRunningLoaders.get(i).args);
        }
    }

    if (getSupportLoaderManager().hasRunningLoaders()) {
        setProgressBarIndeterminateVisibility(Boolean.TRUE);
    } else {
        setProgressBarIndeterminateVisibility(Boolean.FALSE);
    }
}


    @Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelable("RUNNING_LOADERS", mRunningLoaders);

    Log.d(LOG_TAG, "onSaveInstanceState");
}

解决方案

the Parcelable.Creator<RunningLoadersList>() must be static like this

public static final Parcelable.Creator<RunningLoadersList> CREATOR = 
new Parcelable.Creator<RunningLoadersList>() {
...
...
.
}

这篇关于FragmentActivity空指针中的onCreate savedInstanceState捆绑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆