我读了这篇有趣的帖子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次正确执行是可以的。但后来它破了。
提前谢谢你!
答案 0 :(得分:4)
您必须转发到Serializable
的事实应该告诉您问题。我查找了XMPPTCPConnection
的JavaDoc,实际上它没有实现Serializable
。
您的应用程序在您尝试转换为Serializable
时正在死亡,因为该类未实现它。您引用的帖子提到“让自定义类实现Serializable
”,并且因为它是自定义类,开发人员可以进行更改。使用库类,您没有该选项。
您需要提出一种策略来管理连接,可能需要使用某种静态引用(请查看使用WeakReference
以避免泄漏连接)。您还必须在重新创建Activity
(即设备轮换)时处理这种情况,并且如果/当您丢失对它的引用时能够重新建立连接。
我很好奇管理这样的连接的最佳解决方案是什么。我没有直接经验,但也许您可以在GitHub上仔细阅读一些Smack实现,看看其他开发人员如何处理这个问题。