1

我正在构建一个用于在两部 Android 手机之间发送文件的应用程序,现在我有一个 ListActivity 可以检索 sdcard 并列出文件,当 ListActivity 第一次在两台设备上启动时,一个 ServerSocket 被设置并监听.accept()......

此线程在 ListActivity 启动时启动:

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

这是完整的线程类:

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();
        }

    }
}

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

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;
}

发送文件线程:

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();
        }
    }
}

现在,当我启动 ListActivity 并 longClick 一个项目时,文件名被发送到第二个设备,第二个设备弹出一个 alertDialog 询问用户是否接受文件,(接受文件仍然没有准备好现在)如果用户按下 CANCEL(在 ReceiveFileSendRequestThread 上)一个字符串被发送到第一个设备"notosend",第一个用户接收到该字符串"notosend"并根据该线程关闭套接字并重新调用线程以侦听第二个对等方是否要发送另一个文件,并弹出一个 alertDialog 告诉第一个用户您的文件被拒绝接收... >> >> 这完全可行 >>>> 但是当第一个设备尝试发送另一个文件时(再次长按文件 [列表中的项目]),第二个用户成功接收到第一个用户选择的新文件名并 alertDialog弹出如果接受或取消但第一个用户收到文件发送被拒绝......没有第二个用户按下取消按钮!...我不知道为什么toSendOrNot = (String) requestFileInClient.readObject();在不等待第二个设备写入新对象的情况下继续采用先前的值。

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

4

1 回答 1

0

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

于 2013-05-10T21:43:31.047 回答