intent不能放入XMPPTCPConnection类型的对象

时间:2016-02-21 02:05:16

标签: java android xmpp smack

我读了这篇有趣的帖子How to pass an object from one activity to another on Android,发现我应该使用putExtra将对象发送到其他活动并使用getIntent()接收它.getSerializableExtra(" name")是必要的。但是当我使用putExtra时,它迫使我将XMPPTCPConection对象强制转换为(java.io.Serializable)。

java android代码:

  XMPPTCPConnection connection;
  connection=  xmppConnectio.getXMPPConnectio();
  if(connection.equals(null))
  Log.d("","is  null");
  else
  Log.d("","is not null");

  Intent intent=  new Intent(this,chat.class);
  intent.putExtra("connection", (java.io.Serializable) connection);
  startActivity(intent);

但会引发异常

02-21 05:00:44.733    4672-4683/passargad.ehsan D/connected﹕ yes connected successfully :
02-21 05:00:44.733    4672-4672/passargad.ehsan D/﹕ is not null
02-21 05:00:44.733    4672-4672/passargad.ehsan D/AndroidRuntime﹕ Shutting down VM
02-21 05:00:44.733    4672-4672/passargad.ehsan W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x400205a0)
02-21 05:00:44.743    4672-4672/passargad.ehsan E/AndroidRuntime﹕ FATAL EXCEPTION: main
**java.lang.ClassCastException: org.jivesoftware.smack.tcp.XMPPTCPConnection**
at passargad.ehsan.MainActivity.triger(MainActivity.java:189)
at passargad.ehsan.XMPPConnectio$connectionXMPP.onProgressUpdate(XMPPConnectio.java:125)
at passargad.ehsan.XMPPConnectio$connectionXMPP.onProgressUpdate(XMPPConnectio.java:55)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:432) at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:4277)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)

故事的有趣部分是3次正确执行是可以的。但后来它破了。

提前谢谢你!

1 个答案:

答案 0 :(得分:4)

您必须转发到Serializable的事实应该告诉您问题。我查找了XMPPTCPConnection的JavaDoc,实际上它没有实现Serializable

您的应用程序在您尝试转换为Serializable时正在死亡,因为该类未实现它。您引用的帖子提到“让自定义类实现Serializable”,并且因为它是自定义类,开发人员可以进行更改。使用库类,您没有该选项。

您需要提出一种策略来管理连接,可能需要使用某种静态引用(请查看使用WeakReference以避免泄漏连接)。您还必须在重新创建Activity(即设备轮换)时处理这种情况,并且如果/当您丢失对它的引用时能够重新建立连接。

我很好奇管理这样的连接的最佳解决方案是什么。我没有直接经验,但也许您可以在GitHub上仔细阅读一些Smack实现,看看其他开发人员如何处理这个问题。