关于android:由AsyncTask引起的NotSerializableException

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></