2011-11-02 14 views
5

तो बुनियादी तौर पर मैं इस ट्यूटोरियल http://mindtherobot.com/blog/37/android-architecture-tutorial-developing-an-app-with-a-background-service-using-ipc/Parcelable IOException serializable वस्तु

माध्यम से चला गया लेखन क्योंकि यह है का सामना करना पड़ा और अधिक या कम मैं क्या हासिल करना चाहते। मैं चाहता हूं कि मेरी जीपीएस सेवा लगातार जीपीएस निर्देशांक एकत्रित करने और उन्हें एक सरणी में सहेजने के लिए पृष्ठभूमि में चल रही हो, इस तरह कोई उपयोगकर्ता किसी अन्य गतिविधि में स्वैप कर सकता है और मानचित्र गतिविधि पर वापस आ सकता है और यह अभी भी अपने पूरे रिकॉर्ड किए गए पथ को प्लॉट कर सकता है।

इसलिए मैंने आईपीसी स्थापित करने के लिए इस ट्यूटोरियल को कार्यान्वित किया और ऐसा लगता है कि यह कम या ज्यादा काम कर रहा है लेकिन मुझे डेटा को मेरी गतिविधि में वापस लाने में समस्या आ रही है। यहां मेरी फाइलें हैं, सबसे पहले मेरी पार्सेलबल ऑब्जेक्ट है जो एक ऐसी सूची है जो GPSObject के पास रखेगी। अगला मेरे जीपीएसऑब्जेक्ट्स हैं जो केवल एक धारावाहिक वस्तु है जिसमें एंड्रॉइड स्थान ऑब्जेक्ट से कुछ जानकारी शामिल है।

package com.android.SnowFever; 

import java.util.ArrayList; 
import java.util.List; 

import com.android.SnowFever.*; 
import com.google.android.maps.GeoPoint; 

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

public final class GPSResult implements Parcelable { 

public static final Creator<GPSResult> CREATOR = new Creator<GPSResult>() { 
    @Override 
    public GPSResult[] newArray(int size) { 
     return new GPSResult[size]; 
    } 

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

private List<GPSObject> geoPoints; 

public GPSResult() { 
    geoPoints = new ArrayList<GPSObject>(); 
} 

@SuppressWarnings("unchecked") 
private GPSResult(Parcel source) { 
    geoPoints = source.readArrayList(GPSService.class.getClassLoader()); 
} 

public void addGPS(GPSObject location) { 
    geoPoints.add(location); 
} 

public List<GPSObject> getGeoPoints() { 
    return geoPoints; 
} 

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

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeList(geoPoints); 
} 

} 

और ये मेरे GPSObject वर्ग है

package com.android.SnowFever; 

import java.io.Serializable; 

import com.google.android.maps.GeoPoint; 

import android.location.Location; 

public class GPSObject implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

float spd, acc; 
double lat, lng, alt; 
GeoPoint gp; 

public GPSObject(Location l) { 
    lat = l.getLatitude() * 1E6; 
    lng = l.getLongitude() * 1E6; 
    alt = l.getAltitude(); 
    spd = l.getSpeed(); 
    acc = l.getAccuracy(); 
    gp = new GeoPoint((int)lat,(int)lng); 
} 

} 

मेरी GPSResult सूची में फ़ाइलों को जोड़ने के लिए मैं फोन

latestGPSResult.getGeoPoints().add(new GPSObject(location)); 

और मैं, एक बड़ा हिस्सा धागा विषय में त्रुटि शामिल हो जाओ

11-01 18:49:06.818: E/JavaBinder(20754): *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 
11-01 18:49:06.818: E/JavaBinder(20754): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.android.SnowFever.GPSObject) 
11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Parcel.writeSerializable(Parcel.java:1176) 
11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Parcel.writeValue(Parcel.java:1130) 
11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Parcel.writeList(Parcel.java:519) 
11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSResult.writeToParcel(GPSResult.java:52) 
11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSApi$Stub.onTransact(GPSApi.java:52) 
11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Binder.execTransact(Binder.java:320) 
11-01 18:49:06.818: E/JavaBinder(20754): at android.os.BinderProxy.transact(Native Method) 
11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSListener$Stub$Proxy.handleGPSUpdated(GPSListener.java:76) 
11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSService$GeoUpdateHandler.onLocationChanged(GPSService.java:91) 

उत्तर

4
से नीचे की त्रुटि विंडो का

इसका मतलब है कि com.android.SnowFever.GPSObject ऑब्जेक्ट क्रमबद्ध नहीं है। मुझे लगता है कि GeoPoint क्रमबद्ध नहीं है। इसका मतलब है कि आपको writeObject और readObject लागू करना होगा।

2

मुझे लगता है कि आपकी समस्या यह है कि GeoPoint एक Serializable ऑब्जेक्ट नहीं है। मुझे एक ही समस्या थी और ऐसा इसलिए था क्योंकि मेरी कक्षा में उरी थी जो सीरियलज़ेबल इंटरफ़ेस को कार्यान्वित कर रहा था।

1

जटिल वस्तुओं के लिए जो क्रमबद्ध हो जाते हैं, आपको हर ऑब्जेक्ट को क्रमबद्ध करने की आवश्यकता होती है जब तक कि बाकी सब कुछ प्राइमेटिव न हो। आपके मामले में, आपको GeoPoint के लिए एक कंटेनर क्लास को सारणीबद्ध या लिखना होगा जो इसे आपके एप्लिकेशन के आस-पास पास करने की अनुमति देगा।

1

सिप्रियन की तरह कहा, भू-बिंदु एक सूची (इंटरफेस) है जो धारावाहिक नहीं है। इसे एक ArrayList में बदलें - सुनिश्चित करें कि जब आप इसे मानते हैं तो आप इसे एक ArrayList देते हैं और सूची नहीं - इंटरफ़ेस का उपयोग न करें क्योंकि पार्सर को यह नहीं पता होगा कि इसे किस क्रमबद्ध करना है।

2

सुनिश्चित करें कि जिस संरचना को आप क्रमबद्ध करने की कोशिश कर रहे हैं, उसके द्वारा उपयोग किए गए सभी घोंसला वाले वर्ग (पुनरावर्ती) क्रमबद्ध हैं।

संबंधित मुद्दे