Classe introuvable lors de unmarshalling lors du passage de Parcelable par Messager à distance service
J'ai un Parcelable objet que j'utilise pour passer d'une Activité de service à distance. Lorsque je passe à l'aide de AIDL interface, tout ce qui sonne bien.
Récemment, j'essaie de passer à travers Messenger de l'Activité.
//TEST TEST TEST!
StockInfo stockInfo0 = new StockInfo(Code.newInstance("code0"), Symbol.newInstance("symbol0"));
StockInfo stockInfo1 = new StockInfo(Code.newInstance("code1"), Symbol.newInstance("symbol1"));
StockInfo stockInfo2 = new StockInfo(Code.newInstance("code2"), Symbol.newInstance("symbol2"));
List<StockInfo> stockInfos = new ArrayList<StockInfo>();
stockInfos.add(stockInfo0);
stockInfos.add(stockInfo1);
stockInfos.add(stockInfo2);
StockInfosEx stockInfosEx = new StockInfosEx(stockInfos, "abc");
msg.obj = stockInfosEx;
try {
mService.send(msg);
} catch (RemoteException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Je suis l'exception suivante en service à distance.
02-21 22:55:16.546: E/Colis(8365): Classe introuvable lors de l'
unmarshalling: com.exemple.testonmessenger.StockInfosEx, e:
java.lang.ClassNotFoundException:
com.exemple.testonmessenger.StockInfosEx
Je me demandais, ce qui peut se tromper entre les deux? Voici mon Parcelable objet.
public class StockInfosEx implements Parcelable {
public final List<StockInfo> stockInfos;
public final String searchedString;
public StockInfosEx(List<StockInfo> stockInfos, String searchedString) {
this.stockInfos = stockInfos;
this.searchedString = searchedString;
}
////////////////////////////////////////////////////////////////////////////
//Handling Parcelable nicely.
public static final Parcelable.Creator<StockInfosEx> CREATOR = new Parcelable.Creator<StockInfosEx>() {
public StockInfosEx createFromParcel(Parcel in) {
return new StockInfosEx(in);
}
public StockInfosEx[] newArray(int size) {
return new StockInfosEx[size];
}
};
private StockInfosEx(Parcel in) {
stockInfos = new ArrayList<StockInfo>();
in.readTypedList(stockInfos, StockInfo.CREATOR);
searchedString = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeTypedList(stockInfos);
parcel.writeString(searchedString);
}
//Handling Parcelable nicely.
////////////////////////////////////////////////////////////////////////////
}
Pour obtenir le code source complet, merci de télécharger à partir de https://www.dropbox.com/s/n69yuhddpb8vedz/testonmessenger.zip
oui. j'ai posté le code source complet, juste au cas où vous êtes intéressé. ce qui me font douter de moi est l'ensemble de la parcelable est réalisable en vertu de l'AIDL, mais pas Messenger.
aussi, le post stacktrace
C'est la seule trace de la pile de logcat. Croyez-moi. Il est à seulement 1 ligne.
je ne vous crois pas, désolé.
OriginalL'auteur Cheok Yan Cheng | 2013-02-21
Vous devez vous connecter pour publier un commentaire.
Pas Approche pratique (Parce que notre Parcelable est la coutume, ne fait pas partie du Cadre comme Rect)
Activité
De Service À Distance
Approche Pratique
Activité
De Service À Distance
Maintenant, après j'ai lu la documentation de msg.obj (http://developer.android.com/reference/android/os/Message.html#obj) encore une fois, je suis seule à comprendre ce que cela signifie vraiment par
Parcelable of a framework class
OriginalL'auteur Cheok Yan Cheng
Vous êtes probablement ne pas utiliser le bon
ClassLoader
. Vous avez besoin de garder une trace de laClassLoader
qui rassemble la classe à la première place, et l'utilisation QUEClassLoader
à unmarshall.Quand unmarshalling, vous êtes à l'aide du thread actuel du chargeur de classe, ce qui n'est pas votre UIThread mais Android système de thread, et en tant que telle, n'a aucune info à propos de vos classes personnalisées.
J'ai utilisé une classe statique qui contenait mon
ClassLoader
pour résoudre ce (approches similaires peuvent être utilisés sans avoir à être statique).Quelque chose comme:
Puis quand unmarshalling:
Voir cette autre question pour des informations plus détaillées (probablement un doublon btw).
Je vous le dis parce que j'ai eu ce problème avant et moi aussi, j'étais sûr que le droit du chargeur de classe a été utilisé, et il ne l'était pas. Lorsque unmarshalling, vous utilisez Android par défaut du chargeur de classe qui n'a aucune informations à propos de vos classes personnalisées. J'ai utilisé une classe statique qui contenait mon chargeur de classe de résoudre ce problème. Avez-vous lu CommonsWare la réponse de btw?
Mais, mon service distant est dans les différents processus de l'activité. Comment peuvent-ils se référer à une même classe loader? - Je effectuer d'autres tests. Mon service distant peut construire explicitement
StockInfosEx
. Donc, il faut savoir la définition de celui-ci. Juste que je ne suis pas sûr pourquoi Colis échouer sur que.Peut-être que vous voulez aider à l'essai sur le code source complet, pour voir si vous pouvez fournir des commentaires valables? merci toi!
OK. Après la lecture de la documentation et renvoyant votre lien, je peux comprendre pourquoi mon code ne fonctionne pas. Merci.
OriginalL'auteur m0skit0
Si vous êtes vraiment obtenir ce à partir de la télécommande de service, c'est parce que le service distant application ne contient pas de cette classe. Si vous allez utiliser des
Parcelable
classes, à la fois le client et le serveur doivent avoir la même définition de la classe.Si, toutefois, votre trace de la pile se sent comme votre
Parcelable
est accessible à partir d'un système d'exploitation de base du processus, alors vous ne pouvez pas passerParcelable
des objets viaobj
de manière fiable. Je n'ai jamais utiliséobj
surMessage
pour l'objet en cours de passage, jamais pour les croix-de traiter les messages.Parcelable
de l'objet viaobj
. J'ai besoin d'utiliserBundle
.OriginalL'auteur CommonsWare