安卓:有难度传递对象从一个活动到另一个使用包裹 [英] Android: Having Difficulty passing an Object from one activity to another using Parcel

查看:382
本文介绍了安卓:有难度传递对象从一个活动到另一个使用包裹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我读过关于如何使用包裹许多文章和我用它在我的应用程序,但它不工作。我刚刚创建了一个活动,你可以使用连接到计算机。我已经开了一个的java.io.PrintWriter 在Socket上的的OutputStream ,我希望有另一个活动(这是开盘在第一活性触摸按钮)使用相同的的PrintWriter 。我想我在这里做这个错误不是克隆 PrintWriter对象的。我不知道如何克隆它。

这里的第一个活动(我已经删除了一些不必要的功能):

 公共类测试活动扩展了活动实现OnClickListener
{
    字符串的IP;
    INT口;
    插座SOC;
    PrintWriter的作家; //这个在这里工作正常    @覆盖
    公共无效的onCreate(捆绑savedInstanceState)
    {
        IP =;
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);        //连接按钮单击处理程序(你可以跳过这一部分)
        按钮连接=(按钮)findViewById(R.id.connectBTN);
        connect.setOnClickListener(新View.OnClickListener()
        {
            公共无效的onClick(视图v)
            {
                EditText上TB =(EditText上)findViewById(R.id.ipTB);
                IP = TB.getText()的toString()。
                TB =(EditText上)findViewById(R.id.portTB);
                端口=的Integer.parseInt(TB.getText()的toString());
                尝试{
                SOC =新的Socket(IP,端口);
                的ShowDialog(连接成功!);
                作家=新的PrintWriter(soc.getOutputStream(),TRUE);
                }
                赶上(例外ER)
                {
                    的ShowDialog(无法连接\\ n+ er.getMessage());
                    SOC = NULL;
                }
            }
        });        findViewById(R.id.controlmouseBTN).setOnClickListener(本);        //断开点击处理器(也跳过这一部分)
        按钮disconnectBTN =(按钮)findViewById(R.id.disconnectBTN);
        disconnectBTN.setOnClickListener(新View.OnClickListener()
        {
            公共无效的onClick(视图v)
            {
                尝试
                {
                    如果(soc.isConnected())soc.close();
                    writer.close();
                }
                赶上(例外ER){的ShowDialog(无法关闭连接\\ n+ er.getMessage()); }
            }
        });    }    @覆盖
    公共无效的onClick(视图v)//这里是错误的一部分
    {
        //如果(SOC == NULL || soc.isConnected()!){的ShowDialog(未连接到任何一台电脑。);返回; }
        //如果(作家== NULL)回报;
        意图I =新意图(getApplicationContext(),PCController.class);
        中间跨=新的中间(); //这是我创建了Parcelable类
        //inter.set(new字符串(你好)); (我试图发送一个字符串,它工作得很好,只是为了确认我的Parcelable类工作)
        inter.set(作家);
        i.putExtra(打印机,除);
        startActivity(ⅰ);
    }}

下面是Parcelable类的code中级

 进口android.os *。公共类中级实现Parcelable
{
    对象ob;    公共中级()
    {}    公共中级(包裹包裹)
    {
        this.ob = parcel.readValue(Intermediate.class.getClassLoader());
    }    公共无效集(对象o)
    {this.ob = O; }    公共对象的get()
    {
        返回OB;
    }    @覆盖
    公众诠释describeContents()
    {返回0; }    @覆盖
    公共无效writeToParcel(DEST包裹,INT标志)
    {
        dest.writeValue(this.ob);
    }   //我不明白,虽然这部分!只是复制粘贴并修改了类名    公共静态最终Intermediate.Creator<中间> CREATOR =新Intermediate.Creator<中间>(){
        公共中级createFromParcel(包裹中){
            返回新的中间(的); }        公共中级[] newArray(INT大小){
            返回新的中间【尺寸】; }
    };
}

下面是下一个活动的code被解雇。 (我已经张贴只有必不可少的一部分)

  PrintWriter的作家;
    字符串s; //用于测试目的
    刷卡刷卡; //一个SurfaceView    公共无效的onCreate(捆绑包)
    {
        super.onCreate(包);
        刷卡=新的横扫(本);
        swipe.setOnTouchListener(本);
        的setContentView(刷卡);
        意向I = getIntent();
        中间OB =(中级)i.getParcelableExtra(打印机);
        作家=(PrintWriter的)ob.get();
        // S =(字符串)ob.get();
        //的ShowDialog(S); //这显示了我寄的字符串,这意味着字符串获得通过。
    }

现在,当我不连接(即作家为空),我开始下一个活动,没有任何反应(没有错误)。
但是,当我连接(作家不为空),我开始下一个活动,主要活动简直崩溃。我没有刻意去记录错误消息,因为我知道我在做的东西真的错在这里。

任何帮助将是AP preciated!谢谢!

修改:这里是异常堆栈跟踪

  10-26 00:37:55.445:WARN / System.err的(251):了java.lang.RuntimeException:包裹:不能编组值java.io.PrintWriter@44eb0b40
10-26 00:37:55.474:WARN / System.err的(251):在android.os.Parcel.writeValue(Parcel.java:1087)
10-26 00:37:55.484:WARN / System.err的(251):在android.test.Intermediate.writeToParcel(Intermediate.java:33)
10-26 00:37:55.484:WARN / System.err的(251):在android.os.Parcel.writeParcelable(Parcel.java:1106)
10-26 00:37:55.494:WARN / System.err的(251):在android.os.Parcel.writeValue(Parcel.java:1029)
10-26 00:37:55.504:WARN / System.err的(251):在android.os.Parcel.writeMapInternal(Parcel.java:469)
10-26 00:37:55.514:WARN / System.err的(251):在android.os.Bundle.writeToParcel(Bundle.java:1445)
10-26 00:37:55.524:WARN / System.err的(251):在android.os.Parcel.writeBundle(Parcel.java:483)
10-26 00:37:55.534:WARN / System.err的(251):在android.content.Intent.writeToParcel(Intent.java:5237)
10-26 00:37:55.544:WARN / System.err的(251):在android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1204)
10-26 00:37:55.554:WARN / System.err的(251):在android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
10-26 00:37:55.564:WARN / System.err的(251):在android.app.Activity.startActivityForResult(Activity.java:2749)
10-26 00:37:55.574:WARN / System.err的(251):在android.app.Activity.startActivity(Activity.java:2855)
10-26 00:37:55.584:WARN / System.err的(251):在android.test.TestActivity.onClick(TestActivity.java:80)
10-26 00:37:55.594:WARN / System.err的(251):在android.view.View.performClick(View.java:2364)
10-26 00:37:55.606:WARN / System.err的(251):在android.view.View.onTouchEvent(View.java:4179)
10-26 00:37:55.615:WARN / System.err的(251):在android.widget.TextView.onTouchEvent(TextView.java:6541)
10-26 00:37:55.624:WARN / System.err的(251):在android.view.View.dispatchTouchEvent(View.java:3709)
10-26 00:37:55.634:WARN / System.err的(251):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:37:55.634:WARN / System.err的(251):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:37:55.644:WARN / System.err的(251):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:37:55.656:WARN / System.err的(251):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:37:55.664:WARN / System.err的(251):在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
10-26 00:37:55.674:WARN / System.err的(251):在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
10-26 00:37:55.684:WARN / System.err的(251):在android.app.Activity.dispatchTouchEvent(Activity.java:2061)
10-26 00:37:55.694:WARN / System.err的(251):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
10-26 00:37:55.705:WARN / System.err的(251):在android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
10-26 00:37:55.714:WARN / System.err的(251):在android.os.Handler.dispatchMessage(Handler.java:99)
10-26 00:37:55.724:WARN / System.err的(251):在android.os.Looper.loop(Looper.java:123)
10-26 00:37:55.734:WARN / System.err的(251):在android.app.ActivityThread.main(ActivityThread.java:4363)
10-26 00:37:55.744:WARN / System.err的(251):在java.lang.reflect.Method.invokeNative(本机方法)
10-26 00:37:55.754:WARN / System.err的(251):在java.lang.reflect.Method.invoke(Method.java:521)
10-26 00:37:55.764:WARN / System.err的(251):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
10-26 00:37:55.774:WARN / System.err的(251):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-26 00:37:55.785:WARN / System.err的(251):在dalvik.system.NativeStart.main(本机方法)
10-26 00:38:02.424:WARN / System.err的(251):了java.lang.RuntimeException:包裹:不能编组值java.io.PrintWriter@44eb0b40
10-26 00:38:02.454:WARN / System.err的(251):在android.os.Parcel.writeValue(Parcel.java:1087)
10-26 00:38:02.454:WARN / System.err的(251):在android.test.Intermediate.writeToParcel(Intermediate.java:33)
10-26 00:38:02.464:WARN / System.err的(251):在android.os.Parcel.writeParcelable(Parcel.java:1106)
10-26 00:38:02.474:WARN / System.err的(251):在android.os.Parcel.writeValue(Parcel.java:1029)
10-26 00:38:02.486:WARN / System.err的(251):在android.os.Parcel.writeMapInternal(Parcel.java:469)
10-26 00:38:02.494:WARN / System.err的(251):在android.os.Bundle.writeToParcel(Bundle.java:1445)
10-26 00:38:02.505:WARN / System.err的(251):在android.os.Parcel.writeBundle(Parcel.java:483)
10-26 00:38:02.514:WARN / System.err的(251):在android.content.Intent.writeToParcel(Intent.java:5237)
10-26 00:38:02.524:WARN / System.err的(251):在android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1204)
10-26 00:38:02.534:WARN / System.err的(251):在android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
10-26 00:38:02.544:WARN / System.err的(251):在android.app.Activity.startActivityForResult(Activity.java:2749)
10-26 00:38:02.554:WARN / System.err的(251):在android.app.Activity.startActivity(Activity.java:2855)
10-26 00:38:02.554:WARN / System.err的(251):在android.test.TestActivity.onClick(TestActivity.java:80)
10-26 00:38:02.564:WARN / System.err的(251):在android.view.View.performClick(View.java:2364)
10-26 00:38:02.574:WARN / System.err的(251):在android.view.View.onTouchEvent(View.java:4179)
10-26 00:38:02.584:WARN / System.err的(251):在android.widget.TextView.onTouchEvent(TextView.java:6541)
10-26 00:38:02.594:WARN / System.err的(251):在android.view.View.dispatchTouchEvent(View.java:3709)
10-26 00:38:02.604:WARN / System.err的(251):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:38:02.614:WARN / System.err的(251):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:38:02.625:WARN / System.err的(251):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:38:02.634:WARN / System.err的(251):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:38:02.644:WARN / System.err的(251):在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
10-26 00:38:02.654:WARN / System.err的(251):在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
10-26 00:38:02.664:WARN / System.err的(251):在android.app.Activity.dispatchTouchEvent(Activity.java:2061)
10-26 00:38:02.674:WARN / System.err的(251):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
10-26 00:38:02.684:WARN / System.err的(251):在android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
10-26 00:38:02.694:WARN / System.err的(251):在android.os.Handler.dispatchMessage(Handler.java:99)
10-26 00:38:02.704:WARN / System.err的(251):在android.os.Looper.loop(Looper.java:123)
10-26 00:38:02.714:WARN / System.err的(251):在android.app.ActivityThread.main(ActivityThread.java:4363)
10-26 00:38:02.714:WARN / System.err的(251):在java.lang.reflect.Method.invokeNative(本机方法)
10-26 00:38:02.724:WARN / System.err的(251):在java.lang.reflect.Method.invoke(Method.java:521)
10-26 00:38:02.734:WARN / System.err的(251):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
10-26 00:38:02.744:WARN / System.err的(251):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-26 00:38:02.754:WARN / System.err的(251):在dalvik.system.NativeStart.main(本机方法)


解决方案

您已经有了一个更大的问题在这里。你不应该使用包裹活动之间传递的东西。按照Android文档:


  

包裹不是通用序列化机制。这个类(和用于将任意对象成包裹相应Parcelable API)被设计成一个高性能的IPC传输。因此,它不适合放置任何包裹数据中持久性存储:在任何的包裹数据的底层实现的改变可以使较旧的数据无法读取。


您应该使用束来代替。我最常做的就是在类中创建两个静态方法我想叫toBundle和fromBundle活动之间传递。该toBundle需要我想运输类的一个实例,并返回一个包。该fromBunle需要一个包并返回类的一个实例。

我不知道有任何的方式来传递一个复杂的对象类的活动的一个PrintWriter。但还有其他问题,您的code了。你的主UI线程上做网络的东西。这是会导致你的应用程序冻结了很多。您需要将您的所有IO的开了一个不同的线程。这是一件好事,因为那么你可以将所有的IO的东西变成一个单独的类,它是从两个活动的访问。例如,使用 IntentService 。这将使您的应用程序sooooooo好得多。您可能还需要阅读文章无痛线程。这是我建议所有Android开发者至关重要的读取。

I've read MANY articles on how to use Parcel and I've used it in my app but it isn't working. I've just created an activity where you can connect to a computer using Sockets. I've opened a java.io.PrintWriter on the Socket's OutputStream and I want to have another activity (which is opened on touching a button in the 1st activity) use this same PrintWriter. I think the mistake I'm making here is of not cloning PrintWriter object. I don't know how to clone it.

Here's the 1st Activity (I've removed a few unneeded functions):

public class TestActivity extends Activity implements OnClickListener
{
    String ip;
    int port;
    Socket soc;
    PrintWriter writer;   // this works fine here

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        ip = "";
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Connect button click handler (you can skip this part)
        Button connect = (Button)findViewById(R.id.connectBTN);
        connect.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                EditText TB = (EditText)findViewById(R.id.ipTB);
                ip = TB.getText().toString();
                TB = (EditText)findViewById(R.id.portTB);
                port = Integer.parseInt(TB.getText().toString());
                try {
                soc = new Socket(ip,port);
                showDialog("Connected successfully!");
                writer = new PrintWriter(soc.getOutputStream(), true);
                }
                catch(Exception er)
                {
                    showDialog("Couldn't connect.\n"+er.getMessage());
                    soc = null;
                }
            }
        } );

        findViewById(R.id.controlmouseBTN).setOnClickListener(this);

        // disconnect click handler  (skip this part too)
        Button disconnectBTN = (Button)findViewById(R.id.disconnectBTN);
        disconnectBTN.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                try
                {
                    if(soc.isConnected()) soc.close();
                    writer.close();
                }
                catch(Exception er) { showDialog("Couldn't close connection.\n"+er.getMessage()); }
            }
        });

    }

    @Override
    public void onClick(View v)   // here is the erroneous part 
    {
        //if(soc == null || !soc.isConnected()) { showDialog("Not connected to any computer."); return; } 
        //if(writer == null) return;
        Intent i = new Intent(getApplicationContext(), PCController.class);
        Intermediate inter = new Intermediate();   // this is the Parcelable class I've created
        //inter.set(new String("hello"));  (I tried sending a string, which worked fine, just to confirm that my Parcelable class is working)
        inter.set(writer);
        i.putExtra("printer", inter);
        startActivity(i);
    }

}

Here is the code of the Parcelable class Intermediate

import android.os.*;

public class Intermediate implements Parcelable
{
    Object ob;

    public Intermediate()
    {}

    public Intermediate(Parcel parcel)
    {
        this.ob = parcel.readValue(Intermediate.class.getClassLoader());
    }

    public void set(Object o)
    { this.ob = o; }

    public Object get()
    {
        return ob;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags)
    {
        dest.writeValue(this.ob);
    }

   // I don't understand this part though! Just copy pasted and modified the ClassName

    public static final Intermediate.Creator<Intermediate> CREATOR = new Intermediate.Creator<Intermediate>() {
        public Intermediate createFromParcel(Parcel in) {
            return new Intermediate(in); }

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

Here's the code of the Next Activity being fired. (I've posted only the essential part)

PrintWriter writer;
    String s;   // for testing purpose
    Swipe swipe;   // a SurfaceView

    public void onCreate(Bundle bundle)
    {
        super.onCreate(bundle);
        swipe = new Swipe(this);
        swipe.setOnTouchListener(this);
        setContentView(swipe);
        Intent i = getIntent();
        Intermediate ob = (Intermediate)i.getParcelableExtra("printer");
        writer = (PrintWriter)ob.get();
        //s = (String)ob.get();
        //showDialog(s);   // this shows up the string I had sent, which means the string is getting passed.
    }

Now when I don't connect (i.e., writer is null) and I start the next Activity, nothing happens (no errors). But when I connect (writer is not null) and I start the next Activity, the MAIN Activity simply crashes. I didn't bother to log the error message, since I know I'm doing something really wrong here.

Any help would be appreciated! Thanks!

Edit: Here is the Exception Stack Trace

10-26 00:37:55.445: WARN/System.err(251): java.lang.RuntimeException: Parcel: unable to marshal value java.io.PrintWriter@44eb0b40
10-26 00:37:55.474: WARN/System.err(251):     at android.os.Parcel.writeValue(Parcel.java:1087)
10-26 00:37:55.484: WARN/System.err(251):     at android.test.Intermediate.writeToParcel(Intermediate.java:33)
10-26 00:37:55.484: WARN/System.err(251):     at android.os.Parcel.writeParcelable(Parcel.java:1106)
10-26 00:37:55.494: WARN/System.err(251):     at android.os.Parcel.writeValue(Parcel.java:1029)
10-26 00:37:55.504: WARN/System.err(251):     at android.os.Parcel.writeMapInternal(Parcel.java:469)
10-26 00:37:55.514: WARN/System.err(251):     at android.os.Bundle.writeToParcel(Bundle.java:1445)
10-26 00:37:55.524: WARN/System.err(251):     at android.os.Parcel.writeBundle(Parcel.java:483)
10-26 00:37:55.534: WARN/System.err(251):     at android.content.Intent.writeToParcel(Intent.java:5237)
10-26 00:37:55.544: WARN/System.err(251):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1204)
10-26 00:37:55.554: WARN/System.err(251):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
10-26 00:37:55.564: WARN/System.err(251):     at android.app.Activity.startActivityForResult(Activity.java:2749)
10-26 00:37:55.574: WARN/System.err(251):     at android.app.Activity.startActivity(Activity.java:2855)
10-26 00:37:55.584: WARN/System.err(251):     at android.test.TestActivity.onClick(TestActivity.java:80)
10-26 00:37:55.594: WARN/System.err(251):     at android.view.View.performClick(View.java:2364)
10-26 00:37:55.606: WARN/System.err(251):     at android.view.View.onTouchEvent(View.java:4179)
10-26 00:37:55.615: WARN/System.err(251):     at android.widget.TextView.onTouchEvent(TextView.java:6541)
10-26 00:37:55.624: WARN/System.err(251):     at android.view.View.dispatchTouchEvent(View.java:3709)
10-26 00:37:55.634: WARN/System.err(251):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:37:55.634: WARN/System.err(251):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:37:55.644: WARN/System.err(251):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:37:55.656: WARN/System.err(251):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:37:55.664: WARN/System.err(251):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
10-26 00:37:55.674: WARN/System.err(251):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
10-26 00:37:55.684: WARN/System.err(251):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
10-26 00:37:55.694: WARN/System.err(251):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
10-26 00:37:55.705: WARN/System.err(251):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
10-26 00:37:55.714: WARN/System.err(251):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-26 00:37:55.724: WARN/System.err(251):     at android.os.Looper.loop(Looper.java:123)
10-26 00:37:55.734: WARN/System.err(251):     at android.app.ActivityThread.main(ActivityThread.java:4363)
10-26 00:37:55.744: WARN/System.err(251):     at java.lang.reflect.Method.invokeNative(Native Method)
10-26 00:37:55.754: WARN/System.err(251):     at java.lang.reflect.Method.invoke(Method.java:521)
10-26 00:37:55.764: WARN/System.err(251):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-26 00:37:55.774: WARN/System.err(251):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-26 00:37:55.785: WARN/System.err(251):     at dalvik.system.NativeStart.main(Native Method)
10-26 00:38:02.424: WARN/System.err(251): java.lang.RuntimeException: Parcel: unable to marshal value java.io.PrintWriter@44eb0b40
10-26 00:38:02.454: WARN/System.err(251):     at android.os.Parcel.writeValue(Parcel.java:1087)
10-26 00:38:02.454: WARN/System.err(251):     at android.test.Intermediate.writeToParcel(Intermediate.java:33)
10-26 00:38:02.464: WARN/System.err(251):     at android.os.Parcel.writeParcelable(Parcel.java:1106)
10-26 00:38:02.474: WARN/System.err(251):     at android.os.Parcel.writeValue(Parcel.java:1029)
10-26 00:38:02.486: WARN/System.err(251):     at android.os.Parcel.writeMapInternal(Parcel.java:469)
10-26 00:38:02.494: WARN/System.err(251):     at android.os.Bundle.writeToParcel(Bundle.java:1445)
10-26 00:38:02.505: WARN/System.err(251):     at android.os.Parcel.writeBundle(Parcel.java:483)
10-26 00:38:02.514: WARN/System.err(251):     at android.content.Intent.writeToParcel(Intent.java:5237)
10-26 00:38:02.524: WARN/System.err(251):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1204)
10-26 00:38:02.534: WARN/System.err(251):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
10-26 00:38:02.544: WARN/System.err(251):     at android.app.Activity.startActivityForResult(Activity.java:2749)
10-26 00:38:02.554: WARN/System.err(251):     at android.app.Activity.startActivity(Activity.java:2855)
10-26 00:38:02.554: WARN/System.err(251):     at android.test.TestActivity.onClick(TestActivity.java:80)
10-26 00:38:02.564: WARN/System.err(251):     at android.view.View.performClick(View.java:2364)
10-26 00:38:02.574: WARN/System.err(251):     at android.view.View.onTouchEvent(View.java:4179)
10-26 00:38:02.584: WARN/System.err(251):     at android.widget.TextView.onTouchEvent(TextView.java:6541)
10-26 00:38:02.594: WARN/System.err(251):     at android.view.View.dispatchTouchEvent(View.java:3709)
10-26 00:38:02.604: WARN/System.err(251):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:38:02.614: WARN/System.err(251):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:38:02.625: WARN/System.err(251):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:38:02.634: WARN/System.err(251):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
10-26 00:38:02.644: WARN/System.err(251):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
10-26 00:38:02.654: WARN/System.err(251):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
10-26 00:38:02.664: WARN/System.err(251):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
10-26 00:38:02.674: WARN/System.err(251):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
10-26 00:38:02.684: WARN/System.err(251):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
10-26 00:38:02.694: WARN/System.err(251):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-26 00:38:02.704: WARN/System.err(251):     at android.os.Looper.loop(Looper.java:123)
10-26 00:38:02.714: WARN/System.err(251):     at android.app.ActivityThread.main(ActivityThread.java:4363)
10-26 00:38:02.714: WARN/System.err(251):     at java.lang.reflect.Method.invokeNative(Native Method)
10-26 00:38:02.724: WARN/System.err(251):     at java.lang.reflect.Method.invoke(Method.java:521)
10-26 00:38:02.734: WARN/System.err(251):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-26 00:38:02.744: WARN/System.err(251):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-26 00:38:02.754: WARN/System.err(251):     at dalvik.system.NativeStart.main(Native Method)

解决方案

You've got a bigger problem here. You're not supposed use Parcels to pass things between activities. Per the android documentation:

Parcel is not a general-purpose serialization mechanism. This class (and the corresponding Parcelable API for placing arbitrary objects into a Parcel) is designed as a high-performance IPC transport. As such, it is not appropriate to place any Parcel data in to persistent storage: changes in the underlying implementation of any of the data in the Parcel can render older data unreadable.

You should use bundles instead. What I usually do is create two static methods in the class I'm trying to pass between activities called toBundle and fromBundle. The toBundle takes an instance of the class I want to transport and returns a bundle. The fromBunle takes a bundle and returns a instance of the class.

I'm not aware of any way to pass a complex object like a PrintWriter between Activities. But there's other problems with your code too. You're doing network stuff on the main UI thread. This is gonna cause your app to freeze A LOT. You need to move all of your IO off to a different thread. This is good because then you can just move all your IO stuff into a seperate class that's accessible from both activities. For instance, use an IntentService. This will make your app sooooooo much better. You might also want to read the article Painless Threading. It's a crucial read that I recommend for all android developers.

这篇关于安卓:有难度传递对象从一个活动到另一个使用包裹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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