2013-12-17 3 views
0

В моем приложении у меня есть класс «MyService», который выполняет резервное копирование с некоторых данных в телефоне, и это работает в потоке (). и в другом классе у меня есть это:Android: ERROR/AndroidRuntime (1389): FATAL EXCEPTION: Thread-99, java.lang.NullPointerException

public static final Parcelable.Creator<ParentActivityData> CREATOR = new Creator<ParentActivityData>() { 
    @Override 
    public ParentActivityData createFromParcel(Parcel parcel) { 
     return null; 
    } 

, что я не использовать его в любом месте, когда я нажимаю кнопку резервного копирования я получаю эту ошибку:

ERROR/AndroidRuntime(1389): FATAL EXCEPTION: Thread-99 
     java.lang.NullPointerException 
     at com.---.---.MyService$1.run(MyService.java:51) 

как я могу это исправить ???

EDIT:

package com.athena.paadbox.entity; 

import android.os.Parcel; 
import android.os.Parcelable; 

import java.util.HashMap; 
import java.util.List; 

public class ParentActivityData implements Parcelable { 
    public List<SelectableEntity> listDataHeader; 
    public HashMap<String, List<SelectableEntity>> listDataChild; 

    public static final Parcelable.Creator<ParentActivityData> CREATOR = new Creator<ParentActivityData>() { 
     @Override 
     public ParentActivityData createFromParcel(Parcel parcel) { 
      ParentActivityData pad = new ParentActivityData(); 
      return pad; 
     } 

     @Override 
     public ParentActivityData[] newArray(int i) { 
      return new ParentActivityData[0]; 
     } 
    }; 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
    } 
} 

EDIT:

public class SelectableEntity implements Parcelable { 
    public SelectableEntity parent = null; 
    public String title = null; 
    public boolean state = false; 

    public SelectableEntity(String title) { 
     this.title = title; 
    } 

    public SelectableEntity(SelectableEntity parent, String title) { 
     this.parent = parent; 
     this.title = title; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
    } 
} 
+0

вам нужно вернуть экземпляр ParentActivityData в createFromParcel(). (используйте параметр Parcel для чтения ранее записанных вами данных), вы можете подумать, что вы не используете CREATOR в любом месте, но андроид внутренне использует это поле и вызывает метод createFromParcel() ... –

+0

@GopalRao: если я новый PranetActivityData и верну это , хорошо? –

+0

Во-первых, ваш класс ParentActivity реализует Parcelable? если вы записываете данные в парцеллу, переопределяя writeToParcel()? –

ответ

1

попробовать это ...

public class ParentActivityData implements Parcelable { 
    public List<SelectableEntity> listDataHeader; 
    public HashMap<String, List<SelectableEntity>> listDataChild; 

    public ParentActivityData() { 

    } 

    private ParentActivityData(Parcel parcel) { 
     listDataHeader = (List<SelectableEntity>) parcel.readValue(getClass().getClassLoader()); 
     listDataChild = (HashMap<String, List<SelectableEntity>>) parcel.readValue(getClass().getClassLoader()); 
    } 

    public static final Parcelable.Creator<ParentActivityData> CREATOR = new Parcelable.Creator<ParentActivityData>() { 
     @Override 
     public ParentActivityData createFromParcel(Parcel parcel) { 
      return new ParentActivityData(parcel); 
     } 

     @Override 
     public ParentActivityData[] newArray(int size) { 
      return new ParentActivityData[size]; 
     } 
    }; 

    @Override 
    public int describeContents() { 
     return 0xFEED; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int flags) { 
     parcel.writeValue(listDataHeader); 
     parcel.writeValue(listDataChild); 
    } 
} 


public class SelectableEntity implements Parcelable { 
    public SelectableEntity parent = null; 
    public String title = null; 
    public boolean state = false; 
    // Don't use these constructors. 
    /*public SelectableEntity(String title) { 
     this.title = title; 
    } 

    public SelectableEntity(SelectableEntity parent, String title) { 
     this.parent = parent; 
     this.title = title; 
    }*/ 

    public SelectableEntity() { 

    } 

    // use setters 

    public void setParent(SelectableEntity parent) { 
     this.parent = parent; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public void setState(boolean state) { 
     this.state = state; 
    } 

    private SelectableEntity(Parcel parcel) { 
     parent = parcel.readParcelable(getClass().getClassLoader()); 
     title = parcel.readString(); 
     state = (Boolean) parcel.readValue(getClass().getClassLoader()); 
    } 

    @Override 
    public int describeContents() { 
     return 0xFEED; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int flags) { 
     parcel.writeParcelable(parent, flags); 
     parcel.writeString(title); 
     parcel.writeValue((Boolean)state); 
    } 

    public static final Parcelable.Creator<SelectableEntity> CREATOR = new Parcelable.Creator<MainActivity.SelectableEntity>() { 

     @Override 
     public SelectableEntity createFromParcel(Parcel source) { 
      return new SelectableEntity(source); 
     } 

     @Override 
     public SelectableEntity[] newArray(int size) { 
      return new SelectableEntity[size]; 
     } 
    }; 
} 

для этого, чтобы работать, ваш класс SelectableEntity также должен реализовать Parcelable.

+0

Я получил эту ошибку: ERROR/AndroidRuntime (4942): FATAL EXCEPTION: main java.lang.RuntimeException: Parcel: не удалось маршалировать значение [email protected] –

+0

@ElhamGdz Я сказал ваш класс SelectableEntity также должен реализовать Parcelable ... –

+0

Я также реализую Parcelable для моего SelectableEntity, но когда я запустил, я получил эту ошибку: FATAL EXCEPTION: main java.lang.RuntimeException: не удалось запустить службу com...... MyService @ a671c188 с Intent {cmp = com. - .-- /. MyService (имеет дополнительные функции)}: android.os.BadParcelableException: для протокола Parcelable требуется объект Parcelable.Creator, называемый CREATOR в классе com. - .--. entity.SelectableEntity –

Смежные вопросы