意图putExtra的ArrayList<的NameValuePair> [英] Intent putExtra ArrayList<NameValuePair>

查看:110
本文介绍了意图putExtra的ArrayList<的NameValuePair>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有谁知道如何将的ArrayList&LT增加;的NameValuePair> 来一个Intent作为一个额外的

 的ArrayList<的NameValuePair> namevaluepairs中=新的ArrayList<的NameValuePair>();
nameValuePairs.add(新BasicNameValuePair(FIRST_NAME,FIRST_NAME));
nameValuePairs.add(新BasicNameValuePair(姓氏,姓氏));
nameValuePairs.add(新BasicNameValuePair(邮件,邮件));
nameValuePairs.add(新BasicNameValuePair(密码,密码));

/ *把第2步* /
意向意图=新的意图(RegisterActivity1.this,RegisterActivity2.class);
intent.putExtra(NVP,namevaluepairs中);
startActivity(意向);
 

下面是类声明RegisterActivity2:

 公共类RegisterActivity2扩展活动实现Serializable {
}
 

在logcat中的错误是:

 >包裹:不能编组值如first_name =无所谓
 

实施意见由特德·霍普之后,我仍然得到一个错误。这里是堆栈跟踪:

  

  08-04 22:10:16.095:E / AndroidRuntime(5065):致命异常:主要
> 08-04 22:10:16.095:E / AndroidRuntime(5065):
> java.lang.RuntimeException的:无法启动的活动
> ComponentInfo {/ RegisterActivity2}:java.lang.RuntimeException的:
> Parcelable遇到IOException异常读取序列化对象(名
> = database.NVP)08-04 22:10:16.095:E / AndroidRuntime(5065):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> android.app.ActivityThread.access $ 600(ActivityThread.java:135)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1201)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> android.os.Handler.dispatchMessage(Handler.java:99)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> android.os.Looper.loop(Looper.java:137)08-04 22:10:16.095:
> E / AndroidRuntime(5065):在
> android.app.ActivityThread.main(ActivityThread.java:4849)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> java.lang.reflect.Method.invokeNative(本机方法)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> java.lang.reflect.Method.invoke(Method.java:511)08-04 22:10:16.095:
> E / AndroidRuntime(5065):在
> com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:795)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> dalvik.system.NativeStart.main(本机方法)08-04 22:10:16.095:
> E / AndroidRuntime(5065):java.lang.RuntimeException的:产生的原因:
> Parcelable遇到IOException异常读取序列化对象(名
> = database.NVP)08-04 22:10:16.095:E / AndroidRuntime(5065):在android.os.Parcel.readSerializable(Parcel.java:2144)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> android.os.Parcel.readValue(Parcel.java:2016)08-04 22:10:16.095:
> E / AndroidRuntime(5065):在
> android.os.Parcel.readListInternal(Parcel.java:2235)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> android.os.Parcel.readArrayList(Parcel.java:1655)08-04 22:10:16.095:
> E / AndroidRuntime(5065):在
> android.os.Parcel.readValue(Parcel.java:1986)08-04 22:10:16.095:
> E / AndroidRuntime(5065):在
> android.os.Parcel.readMapInternal(Parcel.java:2226)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> android.os.Bundle.unparcel(Bundle.java:223)08-04 22:10:16.095:
> E / AndroidRuntime(5065):在
> android.os.Bundle.getSerializable(Bundle.java:1254)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> android.content.Intent.getSerializableExtra(Intent.java:4268)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> .RegisterActivity2.onCreate(RegisterActivity2.java:24)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> android.app.Activity.performCreate(Activity.java:5244)08-04
> 22:10:16.095:E / AndroidRuntime(5065):在
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):11 ...更多08-04
> 22:10:16.095:E / AndroidRuntime(5065):产生的原因:
> java.io.InvalidClassException:
> org.apache.http.message.BasicNameValuePair; IllegalAccessException
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> java.io.ObjectStreamClass.resolveConstructorClass(ObjectStreamClass.java:694)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:655)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1816)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960)
> 08-04 22:10:16.095:E / AndroidRuntime(5065):在
> android.os.Parcel.readSerializable(Parcel.java:2142)08-04
> 22:10:16.095:E / AndroidRuntime(5065):23 ...更多
 

解决方案

正如其他人所指出的,当你想传递一个数组作为意向额外的元素需要实施序列化。你的情况,该方法是相当简单:定义你自己的 BasicNameValuePair <​​/ code>的子类,声明它实现接口

 公共类NVP扩展BasicNameValuePair实现Serializable {
    公共NVP(字符串名称,字符串值){
        超(名称,值);
    }
}
 

然后你可以使用它就像你一直想:

 的ArrayList&LT; NVP&GT; namevaluepairs中=新的ArrayList&LT; NVP&GT;();
nameValuePairs.add(新NVP(FIRST_NAME,FIRST_NAME));
nameValuePairs.add(新NVP(姓氏,姓氏));
nameValuePairs.add(新NVP(邮件,邮件));
nameValuePairs.add(新NVP(密码,密码));

/ *把第2步* /
意向意图=新的意图(RegisterActivity1.this,RegisterActivity2.class);
intent.putExtra(NVP,namevaluepairs中);
startActivity(意向);
 

在接收端,你需要把它用:

 的ArrayList&LT; NVP&GT; namevaluepairs中=(ArrayList的&LT; NVP&GT;)intent.getSerializable(NVP);
 

修改好了,上面将无法工作,因为 BasicNameValuePair <​​/ code>没有默认的构造函数和序列化机制要求不可序列祖先类有一个默认的构造函数。否则,你会得到反序列化异常。

不幸的是,这意味着该解决方案并不像我造出来的那样简单。一个解决办法是定义你自己的类来实现 Parcelable ,因为 @keerthana MURUGESAN建议在他的回答。如果您已经实施 Parcelable 之前,你知道这是一个有点痛。另一种解决方法是定义一个类,它包装(而不是从中获取的)一个 BasicNameValuePair <​​/ code>和管理自己的序列化:

 公共类NVP实现的NameValuePair,序列化{
    私人BasicNameValuePair NVP;

    公共NVP(字符串名称,字符串值){
        NVP =新BasicNameValuePair(名称,值);
    }

    @覆盖
    公共字符串的getName(){
        返回nvp.getName();
    }

    @覆盖
    公共字符串的getValue(){
        返回nvp.getValue();
    }

    //序列化支持

    私有静态最后长的serialVersionUID = 1L;

    私人无效的writeObject(ObjectOutputStream的了)抛出IOException异常{
        out.writeString(nvp.getName());
        out.writeString(nvp.getValue());
    }

    私人无效的readObject(ObjectInputStream中的)抛出IOException异常,ClassNotFoundException异常{
        NVP =新BasicNameValuePair(in.readString(),in.readString());
    }

    私人无效readObjectNoData()抛出ObjectStreamException {
        // 没事做
    }
}
 

Does anyone know how to add an ArrayList<NameValuePair> to an Intent as an extra?

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("first_name", first_name));
nameValuePairs.add(new BasicNameValuePair("last_name", last_name));
nameValuePairs.add(new BasicNameValuePair("email", email));
nameValuePairs.add(new BasicNameValuePair("password", password));

/* Move on to step 2 */
Intent intent = new Intent(RegisterActivity1.this, RegisterActivity2.class);
intent.putExtra("nvp", nameValuePairs);
startActivity(intent);

Here is the class declaration for RegisterActivity2:

public class RegisterActivity2 extends Activity implements Serializable {
}

The error in the logcat is:

> Parcel: unable to marshal value first_name="whatever"

After implementing the suggestion by Ted Hopp, I still get an error. Here is the stack trace:

08-04 22:10:16.095: E/AndroidRuntime(5065): FATAL EXCEPTION: main
> 08-04 22:10:16.095: E/AndroidRuntime(5065):
> java.lang.RuntimeException: Unable to start activity
> ComponentInfo{/.RegisterActivity2}: java.lang.RuntimeException:
> Parcelable encountered IOException reading a Serializable object (name
> = database.NVP) 08-04 22:10:16.095: E/AndroidRuntime(5065):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> android.app.ActivityThread.access$600(ActivityThread.java:135) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> android.os.Handler.dispatchMessage(Handler.java:99) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> android.os.Looper.loop(Looper.java:137) 08-04 22:10:16.095:
> E/AndroidRuntime(5065):   at
> android.app.ActivityThread.main(ActivityThread.java:4849) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> java.lang.reflect.Method.invokeNative(Native Method) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> java.lang.reflect.Method.invoke(Method.java:511) 08-04 22:10:16.095:
> E/AndroidRuntime(5065):   at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> dalvik.system.NativeStart.main(Native Method) 08-04 22:10:16.095:
> E/AndroidRuntime(5065): Caused by: java.lang.RuntimeException:
> Parcelable encountered IOException reading a Serializable object (name
> = database.NVP) 08-04 22:10:16.095: E/AndroidRuntime(5065):   at android.os.Parcel.readSerializable(Parcel.java:2144) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> android.os.Parcel.readValue(Parcel.java:2016) 08-04 22:10:16.095:
> E/AndroidRuntime(5065):   at
> android.os.Parcel.readListInternal(Parcel.java:2235) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> android.os.Parcel.readArrayList(Parcel.java:1655) 08-04 22:10:16.095:
> E/AndroidRuntime(5065):   at
> android.os.Parcel.readValue(Parcel.java:1986) 08-04 22:10:16.095:
> E/AndroidRuntime(5065):   at
> android.os.Parcel.readMapInternal(Parcel.java:2226) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> android.os.Bundle.unparcel(Bundle.java:223) 08-04 22:10:16.095:
> E/AndroidRuntime(5065):   at
> android.os.Bundle.getSerializable(Bundle.java:1254) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> android.content.Intent.getSerializableExtra(Intent.java:4268) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> .RegisterActivity2.onCreate(RegisterActivity2.java:24) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> android.app.Activity.performCreate(Activity.java:5244) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   ... 11 more 08-04
> 22:10:16.095: E/AndroidRuntime(5065): Caused by:
> java.io.InvalidClassException:
> org.apache.http.message.BasicNameValuePair; IllegalAccessException
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> java.io.ObjectStreamClass.resolveConstructorClass(ObjectStreamClass.java:694)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:655)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1816)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960)
> 08-04 22:10:16.095: E/AndroidRuntime(5065):   at
> android.os.Parcel.readSerializable(Parcel.java:2142) 08-04
> 22:10:16.095: E/AndroidRuntime(5065):     ... 23 more

解决方案

As others have noted, when you want to pass an array as an intent extra, the elements need to implement Serializable. In your case, the approach is fairly simple: define your own subclass of BasicNameValuePair and declare it to implement the interface.

public class NVP extends BasicNameValuePair implements Serializable {
    public NVP(String name, String value) {
        super(name, value);
    }
}

Then you can use it like you've been trying:

ArrayList<NVP> nameValuePairs = new ArrayList<NVP>();
nameValuePairs.add(new NVP("first_name", first_name));
nameValuePairs.add(new NVP("last_name", last_name));
nameValuePairs.add(new NVP("email", email));
nameValuePairs.add(new NVP("password", password));

/* Move on to step 2 */
Intent intent = new Intent(RegisterActivity1.this, RegisterActivity2.class);
intent.putExtra("nvp", nameValuePairs);
startActivity(intent);

On the receiving end, you'll need to pull it out with:

ArrayList<NVP> nameValuePairs = (ArrayList<NVP>) intent.getSerializable("nvp");

EDIT Well, the above won't work because BasicNameValuePair doesn't have a default constructor and the serialization mechanism requires non-serializable ancestor classes to have a default constructor. Otherwise you'll get an exception on deserialization.

Unfortunately, this means that the solution isn't as simple as I made out. One work-around is to define your own class to implement Parcelable, as @keerthana murugesan suggests in his answer. If you've implemented Parcelable before, you know it's a bit of a pain. Another work-around is to define a class that wraps a BasicNameValuePair (instead of deriving from it) and manages its own serialization:

public class NVP implements NameValuePair, Serializable {
    private BasicNameValuePair nvp;

    public NVP(String name, String value) {
        nvp = new BasicNameValuePair(name, value);
    }

    @Override
    public String getName() {
        return nvp.getName();
    }

    @Override
    public String getValue() {
        return nvp.getValue();
    }

    // serialization support

    private static final long serialVersionUID = 1L;

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.writeString(nvp.getName());
        out.writeString(nvp.getValue());
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        nvp = new BasicNameValuePair(in.readString(), in.readString());
    }

    private void readObjectNoData() throws ObjectStreamException {
        // nothing to do
    }
}

这篇关于意图putExtra的ArrayList&LT;的NameValuePair&GT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆