Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Java/Android中正确实现parcel/parcelable in a Hash of objects

如何在Java/Android中正确实现parcel/parcelable in a Hash of objects
EN

Stack Overflow用户
提问于 2013-05-17 09:35:29
回答 1查看 2.4K关注 0票数 0

我有以下课程:实验和测量。我在Android活动之间传递一个包含实验对象的HashMap作为值,并将它们的Experiment.getExperimentName作为键。

这些实验对象又包含测量对象的HashMap。此HashMap将测量对象作为值,并将其Measurements.getMeasurements作为关键字。

然后,这些测量对象包含一个双精度的ArrayList。

我尝试了许多使用捆绑包或直接放入包裹的变体,但当我在新的活动中读取HashMap时,我总是得到一个“解组时的ClassNotFoundException: nl.bioinf.thema12.labpal.objects.Measurements”“。

如何正确实现parcel/parcelable?

实验课:

代码语言:javascript
运行
AI代码解释
复制
package nl.bioinf.thema12.labpal.objects;
import java.util.HashMap;
//import java.util.Set;

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

/**
 * @author roy
 * a class which describes an experiment
 */
public class Experiment implements Parcelable{
    private String experimentName = "";
    private HashMap<String,Measurements> measurements = new HashMap<String,Measurements>();

    //every Experiment needs a name to make it unique
    public Experiment(String experimentName) {
        this.experimentName=experimentName;
    }

    /**
     * a method which adds values to a measurement
     * @param   measurementName the name of the measurement you want to write a value to
     * @param   measurement the value of the measurement you want to add
     * @return  the sequence from the fasta
     */
    public void addValueToMeasurements(String measurementName, double measurement){
        //try to add the measurement
        if(measurements.get(measurementName)== null){
            Measurements m = new Measurements(measurementName);
            m.addMeasurement(measurement);
            measurements.put(measurementName,m);
        }
        //if the measurement does not exist, create it
        else{
            measurements.get(measurementName).addMeasurement(measurement);  
        }
    }
    /**
     * a method which returns the experiment name
     * @return  the experiment name
     */ 
    public String getExperimentName(){
        return experimentName;
    }



    //This makes the object parselable, I don't understand why
    /**
     * a constructor for the parcelable variant of the object
     */     
    public Experiment(Parcel in){
        measurements = new HashMap<String,Measurements>();
        readFromParcel(in);
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    /**
     * a method which writes the objects to a parcel
     */ 
    public void writeToParcel(Parcel dest, int flags) {
        //dest.writeString(experimentName);
        //for(String s: (Set<String>)measurements.keySet()){
            //dest.writeString(s);
            //dest.writeValue(measurements.get(s));
        //}
        Bundle b = new Bundle();
        b.putString("experimentName", experimentName);
        b.putSerializable("measurements", measurements);
        dest.writeBundle(b);
    }

    /**
     * a method which reads from a parcel
     */ 
    public void readFromParcel(Parcel in){
        //experimentName = in.readString();
        Bundle b = in.readBundle();
        experimentName = b.getString("experimentName");
        measurements = (HashMap<String, Measurements>)b.getSerializable("measurements");
    }

    /**
     * generic parcelable creator method
     */ 
    public static final Parcelable.Creator CREATOR =
        new Parcelable.Creator() {
            public Experiment createFromParcel(Parcel in) {
                return new Experiment(in);
            }

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


}

测量类

代码语言:javascript
运行
AI代码解释
复制
package nl.bioinf.thema12.labpal.objects;

import java.util.ArrayList;

import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
/**
 * @author roy
 * a class which describes a group of measurements
 */

public class Measurements implements Parcelable{
    private ArrayList<Double> measurements;
    private String measurementName;

    //each measurement has at least a name and an empty list of measurements
    public Measurements(String measurementName) {
        this.measurementName=measurementName;
        measurements = new ArrayList<Double>();
    }

    /**
     * a method which adds a measurement to an ArrayList of measurements
     * @param   measurement a measurement to add to the ArrayList
     */
    public void addMeasurement(double measurement){
        measurements.add(measurement);
        System.out.println("added a measurement");
    }

    /**
     * a method which returns the measurement name
     * @return  the measurement name
     */
    public String getMeasurementName(){
        return measurementName;
    }

    /**
     * a method which returns an ArrayList of the values in the measurement
     * @return  the values of the measurements in an ArrayList
     */
    public ArrayList<Double> getMeasurements(){
        return measurements;
    }

    //This makes the object parselable, I don't understand why
    /**
     * a constructor for the parcelable variant of the object
     */     
    public Measurements(Parcel in){
        measurements = new ArrayList<Double>();
        readFromParcel(in);

    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    /**
     * a method which writes the objects to a parcel
     */ 
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        //dest.writeString(measurementName);
        //dest.writeList(measurements);
        Bundle b = new Bundle();
        b.putString("measurementName", measurementName);
        b.putSerializable("measurements", measurements);
    }

    /**
     * a method which reads from a parcel
     */ 
    public void readFromParcel(Parcel in){
        //measurementName = in.readString();
        //measurements = in.readArrayList(Object.class.getClassLoader());
        Bundle b = in.readBundle();
        measurementName = b.getString("measurementName");
        measurements = (ArrayList<Double>)b.getSerializable("measurements");
    }

    /**
     * generic parcelable creator method
     */ 
    public static final Parcelable.Creator CREATOR =
        new Parcelable.Creator() {
            public Measurements createFromParcel(Parcel in) {
                return new Measurements(in);
            }

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

接收包的活动的代码

代码语言:javascript
运行
AI代码解释
复制
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //get the intent passed by the other activity
    Bundle b = getIntent().getExtras();
    experiment = b.getParcelable("nl.bioinf.thema12.labpal.objects.Experiment");
    setContentView(R.layout.activity_show_table);
}

用于发送包的活动的代码

代码语言:javascript
运行
AI代码解释
复制
//setup the table button
        table = (Button)findViewById(R.id.button_activityMain_table);
        table.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v){
                try{
                    Intent intentToPassToShowTable = new Intent(MainActivity.this, ShowTable.class);
                    Bundle b = new Bundle();
                    b.putParcelable("nl.bioinf.thema12.labpal.objects.Experiment", experiments.get(experimentName.getSelectedItem().toString()));
                    intentToPassToShowTable.putExtras(b);
                    startActivity(intentToPassToShowTable);
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            }
        });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-17 11:41:14

嗨,试试这段代码,它运行得很好

代码语言:javascript
运行
AI代码解释
复制
  package com.example.objectsharing;

import java.util.ArrayList;
 import java.util.HashMap;

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

public class Experiment implements Parcelable {
private String experimentName = "";
private HashMap<String, ArrayList<Double>> measurements = new HashMap<String, ArrayList<Double>>();

// every Experiment needs a name to make it unique
public Experiment(String experimentName) {
    this.experimentName = experimentName;
}

/**
 * a method which adds values to a measurement
 * 
 * @param measurementName
 *            the name of the measurement you want to write a value to
 * @param measurement
 *            the value of the measurement you want to add
 * @return the sequence from the fasta
 */
public void addValueToMeasurements(String measurementName,
        double measurement) {
    // try to add the measurement
    if (measurements.get(measurementName) == null) {
        // Measurements m = new Measurements(measurementName);
        ArrayList<Double> _data = new ArrayList<Double>();
        // m.addMeasurement(measurement);
        _data.add(measurement);
        measurements.put(measurementName, _data);
    }
    // if the measurement does not exist, create it
    else {
        measurements.get(measurementName).add(measurement);
    }
}

/**
 * a method which returns the experiment name
 * 
 * @return the experiment name
 */
public String getExperimentName() {
    return experimentName;
}

// This makes the object parselable, I don't understand why
/**
 * a constructor for the parcelable variant of the object
 */
public Experiment(Parcel in) {
    measurements = new HashMap<String, ArrayList<Double>>();
    readFromParcel(in);
}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
/**
 * a method which writes the objects to a parcel
 */
public void writeToParcel(Parcel dest, int flags) {
    // dest.writeString(experimentName);
    // for(String s: (Set<String>)measurements.keySet()){
    // dest.writeString(s);
    // dest.writeValue(measurements.get(s));
    // }
    Bundle b = new Bundle();
    b.putString("experimentName", experimentName);
    b.putSerializable("measurements", measurements);
    dest.writeBundle(b);
}

/**
 * a method which reads from a parcel
 */
public void readFromParcel(Parcel in) {
    // experimentName = in.readString();
    Bundle b = in.readBundle();
    experimentName = b.getString("experimentName");
    measurements = (HashMap<String, ArrayList<Double>>) b
            .getSerializable("measurements");
}

/**
 * generic parcelable creator method
 */
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public Experiment createFromParcel(Parcel in) {
        return new Experiment(in);
    }

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

}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16605864

复制
相关文章
<b>与<strong> <em>与<i>标签的区别
 <b>与 <strong>用在网页上都能使字体加粗,二者的不同是:<b>是物理元素 ;<strong>是逻辑元素。  物理元素强调的是一种物理行为。比如说,把一段文字用b加粗,意思是告诉浏览器应该加粗显示,没有其他作用。而<strong>可以从字面理解知道它是强调的意思,<strong>是逻辑标签,强调文档逻辑。  对于搜索引擎(SEO)来说,<strong>比<b>重视的多。 <em>和<i>都是斜体,但是<em>是逻辑元素,<i>是物理元素。
windseek
2018/06/15
1.9K0
equals()与==的区别?
== : 它的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。
黑洞代码
2021/01/14
1.6K0
nohup 与 & 的区别
nohup -- invoke a utility immune to hangups : 运行命令忽略挂起信号
西湖醋鱼
2020/12/30
2.2K0
nohup 与 & 的区别
oracle与mysql结构区别_oracle与mysql的区别
oracle:可变长度varchar2、浮点型number,小数浮点型number(m,n),可变二进制数据raw,大对象类型(存储无结构数据,最大4G)lob
全栈程序员站长
2022/10/05
3.7K0
%与mod的区别
%与mod的区别: %出来的数有正有负,符号取决于左操作数。。。而mod只能是(因为a = b * q + r (q > 0 and 0 <= r < q), then we have a mod q = r 中r要大于等于0小于q)。。。。。
杨鹏伟
2020/09/11
1.7K0
多线程thread与runnable的区别_handlerthread与thread的区别
按照MSDN上讲:“获取或设置一个值,该值指示某个线程是否为后台线程。” 其实这个解释并不到位,至少应该解释一下后台线程的概念!
全栈程序员站长
2022/11/08
1.1K0
CRM/PLM/SCM/MES与ERP的联系与区别
企业通过专设信息机构、信息主管,配备适应现代企业管理运营要求的自动化、智能化、高技术硬件、软件、设备、设施,建立包括网络、数据库和各类信息管理系统在内的工作平台,提高企业经营管理效率的发展模式。那么,在企业信息化建设中所用到的技术CRM、PLM、SCM、MES与ERP这些概念之间又有什么联系与区别呢?
用户5495712
2019/10/31
2.3K0
CharSequence与String的区别
CharSequence与String都能用于定义字符串,但CharSequence是个接口,Sting实现了它。 所以也可以把CharSequence看做String的父类。 例如: public void setText(CharSequence string){ ... } public void setText(String string){ ... } 这2个方法可以同时存在一个类中,因为它们参数不同,都是setText()的重载。 (另外,在Android中,TextView的setText(
张拭心 shixinzhang
2022/05/06
7030
USART与UART的区别
USART(universal synchronous asynchronous receiver and transmitte): 通用同步异步收发器
全栈程序员站长
2022/07/21
8080
prepareStatement与Statement的区别
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139855.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/03
3330
http与socket的区别
手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。
全栈程序员站长
2022/08/05
5140
repository 与 dao的区别
Repository是对象的仓库,也就是保存对象的地方,这个仓库就是我们普通意义的仓库,一个真正OO系统,业务层是围绕活动的对象进行,活动的对象是从仓库中获取的,也是通过交给仓库进行对象长久保管,也就是持久化意思,说白了,就是保存到数据库。 而DAO则没有如此OO概念,DAO是Data access Object,DAO中有数据概念,还是没有摆脱数据库的影子。 所以,Repository替代DAO,是OO深入的趋势,但是在具体处理中,由于性能或设计不够周到或者一些事情把握不定,DAO还会继续存在一段时间,属于过渡式消失。 Repository和DAO两个概念比较中发现,Repository是相对对象而言,而DAO是相对数据库而言,只要我们还是使用关系数据库保存对象,也可能这两者都同时存在,因为侧重点不一样,但是可以肯定的是,业务层应该直接和Repository打交道,而不是DAO.
乐事
2020/08/07
7K0
HTTP与HTTPS的区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
软测小生
2019/07/05
8470
HTTP与HTTPS的区别
session与cookie的区别
(4)设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
葆宁
2019/04/18
6890
进程与线程的区别?
进程是什么? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。 在多道编程中(多道程序设计技术是在计算机内存中同时存放几道相互独立的程序),我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。
老九君
2018/03/06
2.3K1
线程与进程的区别
一个程序至少有一个进程,一个进程至少由一个线程 线程的划分尺度小于进程,使得多线程程序的并发性高 进程的执行过程中拥有独立的内存单元,而多个进程共享内存,从而极大的提高了程序的运行效率。 线程在执行过程中与进程还是有区别的,每个独立的线程有一个程序的入口,顺序执行序列和程序的出口。但线程不能够独立执行,必须依存在于应用程序中。有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立作用,来实现进程的调度和管理以及资源分配,这是线程和进程的重要区别。 进程是具有一定独立功能的程序关于某个数据集合上
莫问今朝
2019/02/25
8160
URI与URL的区别
Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通过通用资源标志符(Universal Resource Identifier, 简称"URI")进行定位。  1.URI一般由三部分组成:  2.访问资源的命名机制。  3.存放资源的主机名。  4.资源自身的名称,由路径表示。  考虑下面的URI,它表示了当前的HTML 4.0规范:  http://www.webmonkey.com.cn/html/html40/     这个URI是这样的:这是一个可通过HTTP协议访问
joshua317
2018/04/16
1.6K0
delete与delete[]的区别
一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。
瑾诺学长
2018/09/21
1.4K0
int与integer的区别
int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型和复杂数据类型 int 是前者而integer 是后者(也就是一个类);因此在类进行初始化时int类的变量初始为0.而Integer的变量则初始化为null. 2.初始化时:   int i =1;Integer i= new Integer(1);(要把integer 当做一个类看);但由于有了自动装箱和拆箱
Java帮帮
2018/03/16
1.1K0
NPAPI与PPAPI的区别
Adobe Flash Player PPAPI是Adobe Flash Player专为chrome内核而开发的,能够保证其在各种浏览器、操作系统和移动设备上使用。Flash开发的软件一般短小精悍,功能强大,兼容性高。文件后缀一般是swf,它能够让公司或个人构建出美妙的数字体验,使您能够在把交互式、丰富的内容与视频、图形和动画组合到一起的Web上,让用户享受最富表现力的、引人入胜的体验。
liuzhen007
2021/06/29
3.1K0

相似问题

ContentDispositionHeaderValue.FileName与asp.net内核中的IFormFile.FileName

11

==与===的区别

108

:+与&:+的区别

11

与的区别

12

<>与!=的区别

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档