【问题标题】:Parcelable encountered IOException when sending instance of an object to other activityParcelable 在将对象的实例发送到其他活动时遇到 IOException
【发布时间】:2016-02-21 15:45:10
【问题描述】:

在 activit-main 的 onCreate 中,我创建了一个名为 XMPPConectio 的类 在 XMMPPConnection 的构造函数中,我接受了 activity-main 的实例,因此我执行了一个 Asychtask。在progressUpdate 中,我调用了activity-main 的triger 函数。我想通过intent.putExtra将XMPPconnectio的实例发送到其他活动的触发函数,但我得到了错误

Parcelable 在写入可序列化对象时遇到 IOException

做所有这些的目的是与其他活动建立联系(当它连接时)。

请给我一些示例代码,谢谢

实现 Serializable 的 XMPPConectio 类:

public class XMPPConnectio implements Serializable {


    XMPPTCPConnection connection;
    String connectionMessages="";
    connectionXMPP connectionXMPPAsynch;
    MainActivity mainActivity;


    public XMPPTCPConnection getXMPPConnectio ()
    {
        return connection;
    }

   public XMPPConnectio(MainActivity mainActivity)
    {
    this.mainActivity=mainActivity;
    try
    {
        connectionXMPPAsynch =new connectionXMPP();
        connectionXMPPAsynch.execute();
    }
    catch (Exception e)
    {
    }
    }

    class connectionXMPP extends AsyncTask<String,Void,String>
    {

        @Override
        protected String doInBackground(String... params) {


            connection = new XMPPTCPConnection(XMPPTCPConnectionConfiguration.builder()
            .setServiceName("192.168.1.6")
            .setUsernameAndPassword("ehsan", "123")
            .setPort(9090)
            .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
            .setDebuggerEnabled(true)
            .setCompressionEnabled(false).build());
            connection.setUseStreamManagement(true);
            connection.addConnectionListener(new ConnectionListener()
            {

                @Override
                public void connected(XMPPConnection connection) {
                    Log.d("connected", "yes connected successfully : ");
                    publishProgress();
                }

                @Override
                public void authenticated(XMPPConnection connection, boolean resumed) {
                    Log.d("connected","yes authenticated successfully : ");
                }

                @Override
                public void connectionClosed() {
                    Log.d("connected","yes connectionClosed successfully : ");
                }

                @Override
                public void connectionClosedOnError(Exception e) {

                    Log.d("connected","yes connectionClosedOnError  : ");
                }

                @Override
                public void reconnectionSuccessful() {
                    Log.d("connected","yes reconnection successfully : ");
                }

                @Override
                public void reconnectingIn(int seconds) {
                    Log.d("connected","yes reconnectingIn  : ");
                }

                @Override
                public void reconnectionFailed(Exception e) {
                    Log.d("connected","yes reconnectionFailed  : ");
                }
            });

           connect();
            return null;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
            mainActivity.triger();
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Log.d("","onPostExecute");
        }
         private void connect()
        {
        try {

                connection.connect();

            } catch (SmackException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XMPPException e) {
                e.printStackTrace();
            }
        }
    }
}

创建 XMPPConectio 实例并导致 Asychtask 执行的 Activity

package passargad.ehsan;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Serializable;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.net.Socket;

public class MainActivity extends ActionBarActivity implements Serializable {


    private Socket socket;
    private String serverIpAddress = "192.168.1.6";
    XMPPConnectio xmppConnectio;
    XMPPTCPConnection connection;
    private static final int REDIRECTED_SERVERPORT = 6789;


    FastFood fastFood;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent=new Intent(this,SocketService.class);
        startService(intent);

        fastFood =new FastFood(this);

        xmppConnectio=new XMPPConnectio(this);


    }

// this is the function which is called (when connection is done ) by //onProgressUpdate of Asychtask 

   public void triger()
    {


        try {
            Intent intent=  new Intent(this,chat.class);
            intent.putExtra("XMPP",xmppConnectio);
             startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }


}

这是我希望在其中包含 XMPPConnectio 但执行从未达到此目的的活动

package passargad.ehsan;

import android.app.Application;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;

import java.io.IOException;


public class chat extends ActionBarActivity {
    XMPPConnectio xmppConnectio;
    XMPPTCPConnection connection;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);


        xmppConnectio=(XMPPConnectio)getIntent().getSerializableExtra("XMPP");
        Log.d("","done");
 }
}

我试图通过提供所有代码来使问题变得清晰。正如我所说,目标是在连接连接时在所有活动中建立连接。 谢谢。

【问题讨论】:

    标签: java android serialization xmpp smack


    【解决方案1】:

    如果我想在每个活动中都可以访问连接对象,其中一种解决方案是使用捆绑包并有意发送捆绑包。但实际问题是 API 级别 10(android 2.3)中没有捆绑选项。另一个问题是,由于 XMPPTCPConnection 没有实现可序列化,因此无法选择使用序列化和 putExtra。所以我使用了第三个选项,它定义了静态对象。

    所以我把 XMPPConectio 类改成了这个

     import android.app.Application;
        import android.content.Intent;
        import android.os.AsyncTask;
        import android.os.IBinder;
        import android.util.Log;
    
        import org.jivesoftware.smack.ConnectionConfiguration;
        import org.jivesoftware.smack.ConnectionListener;
        import org.jivesoftware.smack.SmackException;
        import org.jivesoftware.smack.XMPPConnection;
        import org.jivesoftware.smack.XMPPException;
        import org.jivesoftware.smack.chat.Chat;
        import org.jivesoftware.smack.chat.ChatManager;
        import org.jivesoftware.smack.chat.ChatManagerListener;
        import org.jivesoftware.smack.chat.ChatMessageListener;
        import org.jivesoftware.smack.packet.Message;
        import org.jivesoftware.smack.tcp.XMPPTCPConnection;
        import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
    
        import java.io.IOException;
        import java.io.Serializable;
    
    
        public class XMPPConnectio  {
    
    
            XMPPTCPConnection connection;
            String connectionMessages="";
            connectionXMPP connectionXMPPAsynch;
            MainActivity mainActivity;
    
    
            public XMPPTCPConnection getXMPPConnectio ()
            {
                return connection;
            }
    
           public XMPPConnectio(MainActivity mainActivity)
            {
            this.mainActivity=mainActivity;
            try
            {
                connectionXMPPAsynch =new connectionXMPP();
                connectionXMPPAsynch.execute();
            }
            catch (Exception e)
            {
            }
            }
    
            class connectionXMPP extends AsyncTask<String,Void,String>
            {
    
                @Override
                protected String doInBackground(String... params) {
    
    
                    connection = new XMPPTCPConnection(XMPPTCPConnectionConfiguration.builder()
                    .setServiceName("192.168.1.6")
                    .setUsernameAndPassword("ehsan", "123")
                    .setPort(9090)
                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                    .setDebuggerEnabled(true)
                    .setCompressionEnabled(false).build());
                    connection.setUseStreamManagement(true);
                    connection.addConnectionListener(new ConnectionListener()
                    {
    
                        @Override
                        public void connected(XMPPConnection connection) {
    
                            Log.d("connected","yes connected successfully : ");
                            publishProgress();
                        }
    
                        @Override
                        public void authenticated(XMPPConnection connection, boolean resumed) {
                            Log.d("connected","yes authenticated successfully : ");
    
                        }
    
                        @Override
                        public void connectionClosed() {
                            Log.d("connected","yes connectionClosed successfully : ");
                        }
    
                        @Override
                        public void connectionClosedOnError(Exception e) {
    
                            Log.d("connected","yes connectionClosedOnError  : ");
                        }
    
                        @Override
                        public void reconnectionSuccessful() {
                            Log.d("connected","yes reconnection successfully : ");
                        }
    
                        @Override
                        public void reconnectingIn(int seconds) {
                            Log.d("connected","yes reconnectingIn  : ");
                        }
    
                        @Override
                        public void reconnectionFailed(Exception e) {
                            Log.d("connected","yes reconnectionFailed  : ");
                        }
                    });
    
                   connect();
                    return null;
                }
    
                @Override
                protected void onProgressUpdate(Void... values) {
                    super.onProgressUpdate(values);
                    mainActivity.triger();
                }
    
                @Override
                protected void onPostExecute(String s) {
                    super.onPostExecute(s);
                    Log.d("","onPostExecute");
                }
                 private void connect()
                {
                try {
    
                        connection.connect();
                       // connection.login();
    
                    } catch (SmackException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (XMPPException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    

    创建 XMPPConectio 实例并导致 Asychtask 执行的 Activity

    package passargad.ehsan;
    
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.provider.Settings;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import org.jivesoftware.smack.SmackException;
    import org.jivesoftware.smack.XMPPConnection;
    import org.jivesoftware.smack.XMPPException;
    import org.jivesoftware.smack.tcp.XMPPTCPConnection;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.io.Serializable;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.net.Socket;
    
    public class MainActivity extends ActionBarActivity {
    
    private Socket socket;
    private String serverIpAddress = "192.168.1.6";
    XMPPConnectio xmppConnectio;
    public static XMPPTCPConnection connection;
    private static final int REDIRECTED_SERVERPORT = 6789;
    
    
    FastFood fastFood;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent=new Intent(this,SocketService.class);
        startService(intent);
        fastFood =new FastFood(this);
    
        //this is
        xmppConnectio=new XMPPConnectio(this);
    
    
    
    }
    
    public void triger()
    {
    
        connection=xmppConnectio.getXMPPConnectio();
        Intent intent=  new Intent(this,chat.class);
        startActivity(intent);
    
    }
    

    }

    这是我们可以访问那里的连接的活动

    package passargad.ehsan;
    
    import android.app.Application;
    import android.content.Intent;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    
    import org.jivesoftware.smack.ConnectionListener;
    import org.jivesoftware.smack.SmackException;
    import org.jivesoftware.smack.XMPPConnection;
    import org.jivesoftware.smack.XMPPException;
    import org.jivesoftware.smack.tcp.XMPPTCPConnection;
    
    import java.io.IOException;
    
    
    public class chat extends ActionBarActivity {
    XMPPTCPConnection connection;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
    
        //this is
            connection=MainActivity.connection;
            connection.addConnectionListener(new ConnectionListener() {
                @Override
                public void connected(XMPPConnection connection) {
                    Log.d("","connected");
    
                }
            @Override
            public void authenticated(XMPPConnection connection, boolean resumed) {
                Log.d("","6");
            }
    
            @Override
            public void connectionClosed() {
                Log.d("","5");
            }
    
            @Override
            public void connectionClosedOnError(Exception e) {
                Log.d("","4");
            }
    
            @Override
            public void reconnectionSuccessful() {
                Log.d("","3");
            }
    
            @Override
            public void reconnectingIn(int seconds) {
                Log.d("","2");
            }
    
            @Override
            public void reconnectionFailed(Exception e) {
                Log.d("","1");
            }
        });
        try {
            connection.login();
        } catch (XMPPException e) {
            e.printStackTrace();
        } catch (SmackException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
    
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-30
      • 2020-07-22
      • 2014-08-03
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 2013-08-11
      相关资源
      最近更新 更多