Java Android-将类X的实例从活动A发送到活动B

Java Android-将类X的实例从活动A发送到活动B,java,android,android-intent,android-activity,runtimeexception,Java,Android,Android Intent,Android Activity,Runtimeexception,从main活动中,我尝试将连接类发送到Mapsactivity,以便可以使用Mapsactivity中连接类中的方法 由于某种原因,我在启动Mapsactivity时出现了此错误 java.lang.RuntimeException:Parcelable在写入可序列化对象时遇到IOException 我不确定问题出在哪里,我的连接类已经实现了Serializable,我还让我的Mainactivity实现了Serializable,看看它是否可以修复,但没有成功 我的应用程序应该可以让人们连接到

从main活动中,我尝试将连接类发送到Mapsactivity,以便可以使用Mapsactivity中连接类中的方法

由于某种原因,我在启动Mapsactivity时出现了此错误

java.lang.RuntimeException:Parcelable在写入可序列化对象时遇到IOException

我不确定问题出在哪里,我的连接类已经实现了Serializable,我还让我的Mainactivity实现了Serializable,看看它是否可以修复,但没有成功

我的应用程序应该可以让人们连接到一个服务器,在那里他们可以发送自己的位置,从其他连接的人那里接收位置,并将坐标显示在地图上。我已经删除了与此问题无关的代码,因此不需要阅读。我相信我已经得到了所有必要的代码,如果还不够,我可以发布整个类。 提前谢谢

主要活动类

public class MainActivity extends FragmentActivity{
private Connection connection;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initialize();
    setListeners();
}

public void initialize() {
    connection = new Connection("xxx.xxx.xxx.x",xxxx);
    btnShowMap = (Button)findViewById(R.id.btnShowMap);
    Log.w(null, "Initialized");
}

public void startMap() {
    Intent intent = new Intent(this, MapsActivity.class);
    intent.putExtra("class", connection);
    startActivity(intent);
}

public void setListeners() {
    btnShowMap.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            btnShowMap.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    startMap();
                }
            });
        }
    });
}
连接类

    public class Connection implements Serializable{
private InetAddress address;
private int port;
private String ip, groupName, myName, total, membersInfo, id, fName;
private Socket socket;
private InputStream is;
private DataInputStream dis;
private OutputStream os;
private DataOutputStream dos;
private boolean connected = false;
private double latitude, longitude, fLong ,fLat;
private String name;
private double Longi, Lati;

public Connection(String ip, int port){
    this.ip = ip;
    this.port = port;
}

public void listenToServer() {
    Thread thread = new Thread(new ListenToServer());
    thread.start();
}

private class ListenToServer implements Runnable {
    public void run() {
        Log.w(null,"Listening to server");
        try {
            String locations = new String(dis.readUTF());
            if(locations == null) {
                Log.e(null,"EMPTY");
            }
            if(locations != null) {
                JSONObject friends = new JSONObject(locations);
                JSONArray jsonArray = friends.getJSONArray("location");
                JSONObject transaction;
                for (int i = 0; i < jsonArray.length(); i++) {
                    transaction = jsonArray.getJSONObject(i);
                    fName = transaction.getString("member");
                    fLong = transaction.getDouble("longitude");
                    fLat = transaction.getDouble("latitude");
                }
            }
            if (locations == null) {
                dis.close();
            }
        }
        catch (JSONException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

您将无法在活动之间传递
连接
,因为其中的大部分内容无法序列化或转换为
。请注意,以下任何一项都不支持这两种操作:

private InputStream is;
private DataInputStream dis;
private OutputStream os;
private DataOutputStream dos;
要么:

  • 这应该是一个服务,特别是当工作应该独立于任何UI完成时,或者

  • 这将需要一个单身汉,或者

  • 没有单独的活动,而是一个包含多个片段的活动,或者

  • 将所有与连接相关的工作隔离到单个活动中


正如Commonware所说,您需要重新考虑您的设计,连接通常独立于您的活动,因为大多数活动可能需要在您注意到自己时使用它

您可以做的是创建
Application
的子类,作为维护
连接的一种方式,将其作为一个全局实例,供您的所有活动访问:例如单例

    public class MyApp extends Application{

          public void onCreate(){
            super.onCreate();           
          }

          private static Connection con=null;

          private Connection(){

             //initialize a connection here

          }

          public static Connection getConnection(){

              if(con==null){

             con=new Connection();
             return con;
              }else{

               return con;
              }        

          }
     }
通过这种方式,您可以通过调用MyApp.getConnection()从任何活动访问连接
con
。只是不要忘记将
MyApp
添加到清单中

    public class MyApp extends Application{

          public void onCreate(){
            super.onCreate();           
          }

          private static Connection con=null;

          private Connection(){

             //initialize a connection here

          }

          public static Connection getConnection(){

              if(con==null){

             con=new Connection();
             return con;
              }else{

               return con;
              }        

          }
     }