0

I pass object Channel via Intent from one activity to another activity. I use Parceler. App crashes saying that it can't find virtual method getLatitude().

I got this error:

--------- beginning of crash
    06-30 16:28:48.501 E/AndroidRuntime: FATAL EXCEPTION: main
     Process: com.example.app.debug, PID: 22168
     java.lang.NoSuchMethodError: No virtual method getLatitude()D in class Lim/grouvi/app/entity/LocationDetails; or its super classes (declaration of 'im.grouvi.app.entity.LocationDetails' appears in /data/app/com.example.app.debug-1/split_lib_slice_6_apk.apk)
    at im.grouvi.app.entity.LocationDetails$$Parcelable.write(LocationDetails$$Parcelable.java:40)
   at im.grouvi.app.entity.Channel$$Parcelable.write(Channel$$Parcelable.java:56)
   at im.grouvi.app.entity.Membership$$Parcelable.write(Membership$$Parcelable.java:51)
   at im.grouvi.app.entity.Membership$$Parcelable.writeToParcel(Membership$$Parcelable.java:30)
   at android.os.Parcel.writeParcelable(Parcel.java:1496)
   at android.os.Parcel.writeValue(Parcel.java:1402)

My LocationDetails class:

import org.parceler.Parcel
import java.util.*

@Parcel(Parcel.Serialization.BEAN)

class LocationDetails {
    var name: String? = null

    @JsonProperty("country_code")
    var countryCode: String? = null

    var latitude: Double? = null
    var longitude: Double? = null

    @JsonIgnore
    fun dataIsConsistent(): Boolean {
        return !TextUtils.isEmpty(name) && (longitude != 0.0) and (latitude != 0.0)
    }

    val mappedLocation: Map<String, Any>
        get() {
            val params = HashMap<String, Any>()
            name?.let { params.put("name", it) }
            countryCode?.let { params.put("country_code", it) }
            latitude?.let { params.put("latitude", it) }
            longitude?.let { params.put("longitude", it) }

            return params
        }
}

Parent class Channel that has LocationDetails

import org.parceler.Parcel
import org.parceler.Transient
import java.util.*

@JsonIgnoreProperties(ignoreUnknown = true)
@Parcel(Parcel.Serialization.BEAN)

open class Channel : Model {
...
var location: LocationDetails? = null
...
}

One more parent Membership:

@JsonIgnoreProperties(ignoreUnknown = true)
@org.parceler.Parcel(org.parceler.Parcel.Serialization.BEAN)
class Membership : Model, Comparable<Membership> {
...
var channel: Channel? = null
...
}
Rafael
  • 6,091
  • 5
  • 54
  • 79
  • Just FYI: geo position at (0.0; 0.0) is OK, inconsistent state is (null; null). To avoid boxing (which happens with nullable types), you can use `Double.NaN` as inconsistent state marker. Also, objects, which can be inconsistent, are very sad. – Miha_x64 Jun 30 '17 at 10:51
  • Thanks. Good point about location validity – Rafael Jun 30 '17 at 10:57
  • Did you use Proguard on the code? – tynn Jun 30 '17 at 10:57
  • I have this in Proguard rules file: `# Parcel library -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keep class org.parceler.Parceler$$Parcels` – Rafael Jun 30 '17 at 10:59
  • Currently trying to use Kotlin plugin kapt( (Kotlin Annotation Processing).) instead of apt – Rafael Jun 30 '17 at 12:15
  • I would be interested in the generated source of `LocationDetails$$Parcelable` as well. – tynn Jun 30 '17 at 12:38
  • After adding kapt(https://kotlinlang.org/docs/reference/kapt.html), I am not seeing this error anymore – Rafael Jun 30 '17 at 12:42

0 Answers0