NotSerializableException caused by AsyncTask
我想在活动之间导航并传递一个对象。对象是客户端(电话)和服务器(计算机)之间的TCP连接。当用户按下按钮时,将启动新活动,并将用户重定向到新页面。
我希望能够从不同的活动向服务器发送某些命令。
但是,我在活动之间传递对象时遇到问题。每当我尝试进入下一个活动时,都会出现以下错误:
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object
Caused by: java.io.NotSerializableException:
com.example.user.myapp.HomePage$ConnectTask$1
号
AsyncTask正在抛出错误,我相信它不是这个问题的副本。所有类都已实现可序列化。
在我的心里
1 2 3 4 5 | connecttask = new ConnectTask(); connecttask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); final Intent i = new Intent(getBaseContext(),Menu.class); final ArrayList<TcpClient> testing = new ArrayList<TcpClient>(); |
在我的办公室里
1 2 3 4 5 6 7 8 9 10 | public void onClick(View view) { if(Username.getText().toString().equals("admin") && Password.getText().toString().equals("admin")) { Toast.makeText(getApplicationContext(), "Redirecting...",Toast.LENGTH_SHORT).show(); testing.add(mTcpClient); i.putParcelableArrayListExtra("extra",testing); startActivity(i); } |
号
异步任务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public class ConnectTask extends AsyncTask<String, String, TcpClient> implements Serializable { @Override protected TcpClient doInBackground(String... message) { System.out.println("Executed call"); mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() { @Override public void messageReceived(String message) { try { publishProgress(message); if (message != null) { System.out.println("Returned message from socket::::: >>>>>>" + message); } } catch (Exception e) { e.printStackTrace(); } } }, ipAddressOfServerDevice); if (mTcpClient != null) { mTcpClient.sendMessage("Initial message when connected with Socket Server"); } delay(); return mTcpClient; } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); arrayList.add(values[0]); mAdapter.notifyDataSetChanged(); } } |
"我认为parcellable means about"。恩,你可以把它在均值二进制序列化和流通过程potentially知道。你怎么能做这与任务或线程?不发生。P></
You need to do a Little lifecycle在线阅读活动,和各种战略管理的对象现场,为周安效比。P></
You need to about the场景)。(1)你的活动是从resurrected to something like下来安两个方向变化(短期端of the活性)。(2)into the背景活动?你知道你的眼泪下,Android应用,和一resurrects(EN端of the长期活动)。(3)你的应用背景和GOES into the,the process with the Android全部终止后的人口从EN of resurrecting序列化了。场景(3)is the reason为什么parcellables are used to the序列化活动:临时存储的地方得到parcellable written to the process,and some终止后,很长时间,得到restarted get from the parcellables,临时存储和读取,在活动开始变得与那些parcellables supplied适当的参数。成分。你的线程不明显,会生存下去。P></
the right thing to do is the connection全部包在TCP服务,which will if wants to生存更好的完成你的Android的GOES into the process当EN EN和背景,resurrect以后。is that the of a服务优势它可以生活在30分钟到会,甚至如果你的应用程序的背景和背景is in the;永远,如果你为你的后通知服务。服务管理somewhat to是痛苦的;但很多东西relates of the Pain to You have to do啊。最大的痛苦,你必须完全有效的工作背景callbacks remove from the so that can be the application垃圾文集。for the服务提供框架,在做一些有用的,在与potentially lifecycle管理。P></
你也可以使用片段(without IU)to address(方案1)。在while和for a short情景(2)。你可以argue that for联机工作是简单的,并适用于。但我猜你is that盎司连接,你会遇见sort of the same the connection with维护问题。我知道is probably the right服务选择。或者,或片段,以完整的异步操作。shepherding责任for TCP在背景线程和回来。P></
如果你utterly TCP connection is disposable & * *也失去它,你可以使用静态变量。你需要很小心to be about the lifecycle嗯总经理虽然非常小心和about that have been to dangling references镇静活动。P></
somewhat痛苦。但如果你让它工作一感,most of the Hard work to和to be done has a服务实施"订单otherwise for a custom啊如果你去解。P></