Android - ObjectInputStream使用.reset()继续读取前一个值

时间:2013-05-09 19:24:14

标签: android sockets serversocket objectinputstream

我正在构建一个用于在两个Android手机之间发送文件的应用程序,现在我有一个ListActivity来检索sdcard并列出文件,当ListActivity首次在两台设备上启动时,设置了ServerSocket并用{{ 1}} ...

此线程在ListActivity启动时启动:

.accept()

这是完整的线程类:

ReceiveFileSendRequestThread ReceiveFileSendRequestThread = new ReceiveFileSendRequestThread();
ReceiveFileSendRequestThread.start();

当onLong点击一个项目(发送文件)时,以下线程开始:

static public class ReceiveFileSendRequestThread extends Thread {
    public void run() {
        ServerSocket serverSocket;
        try {
            serverSocket = new ServerSocket(6789, 200);
            connectionServ = serverSocket.accept();
            requestFileInServer = new ObjectInputStream(
                    connectionServ.getInputStream());
            requestFileString = (String) requestFileInServer.readObject();

            handler.post(new AcceptFileSendAlertDialogRunnable());

            while (okToSend == null) {

            }

            if (okToSend == true) {
                requestFileOutServer = new ObjectOutputStream(
                        connectionServ.getOutputStream());
                requestFileOutServer.writeObject("oktosend");
                requestFileOutServer.flush();
                serverSocket.close(); // // Receive File

            } else if (okToSend == false) {
                requestFileOutServer = new ObjectOutputStream(
                        connectionServ.getOutputStream());
                requestFileOutServer.reset();
                requestFileOutServer.writeObject("notosend");
                requestFileOutServer.flush();
                serverSocket.close();

                ReceiveFileSendRequestThread ReceiveFileSendRequestThread = new ReceiveFileSendRequestThread();
                ReceiveFileSendRequestThread.start();
            }

        } catch (IOException e) {
            Log.d("Connection Error:", "Error binding port!");
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

SendFile线程:

public boolean onItemLongClick(AdapterView<?> parentView, View childView,
        int position, long id) {
    // TODO Auto-generated method stub

    fileClickedName = (((TextView) childView).getText()).toString();
    fileClickedPath = file.toString() + "/" + fileClickedName;
    fileClickedFile = new File(fileClickedPath);

    SendFileThread SendFileThread = new SendFileThread();
    SendFileThread.start();

    return true;
}

现在,当我启动ListActivity并对项目进行longClick时,文件名将被发送到第二个设备,第二个设备会弹出一个alertDialog,询问用户是否接受该文件,(接受文件仍然是现在还没准备好)如果用户按下CANCEL(在ReceiveFileSendRequestThread上),一个字符串被发送到第一个设备static public class SendFileThread extends Thread { public void run() { Socket socket = new Socket(); try { socket.connect(new InetSocketAddress(sharedIp, 6789), 200); requestFileOutClient = new ObjectOutputStream( socket.getOutputStream()); requestFileOutClient.writeObject(fileClickedName); requestFileOutClient.flush(); requestFileInClient = new ObjectInputStream( socket.getInputStream()); toSendOrNot = (String) requestFileInClient.readObject(); if (toSendOrNot.equals("oktosend")) { socket.close(); } else if (toSendOrNot.equals("notosend")) { socket.close(); ReceiveFileSendRequestThread ReceiveFileSendRequestThread = new ReceiveFileSendRequestThread(); ReceiveFileSendRequestThread.start(); handler.post(new ClientFileSendAlertDialogRunnable()); } // // } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ,第一个用户收到字符串"notosend"并根据该线程关闭套接字并且如果他想发送另一个文件,则重新调用该线程来收听第二个对等体,并弹出一个alertDialog告诉第一个用户您的文件被拒绝接收...&gt;&gt;&gt;&gt;这完全有效&gt;&gt;&gt;&gt;但是当第一个设备尝试发送另一个文件(再次长按文件[列表中的项目])时,第二个用户成功接收第一个用户选择的新文件名,并且如果接受或取消,则会弹出alertDialog但是用户收到文件发送被拒绝...没有第二个用户按下取消按钮! ...我不知道为什么"notosend"在没有等待第二个设备写新对象的情况下继续使用前一个值。

如果有人可以帮助我,我将不胜感激,非常感谢。

1 个答案:

答案 0 :(得分:0)

经过小时调试&gt;&gt;&gt;我最终发现了这个BUG! 在线程ReceiveFileSendRequestThread()中,Boolean变量okToSend在第一次接收来自第二个设备的请求时为空,当第二个设备取消请求时,oKtoSend将设置为{{ 1}},因此每当第二个设备尝试发送另一个文件时,变量notosend将始终具有先前分配的值。所以我只是在okToSend循环之前添加okToSend = null;,现在工作正常。