我正在构建一个用于在两个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"
在没有等待第二个设备写新对象的情况下继续使用前一个值。
如果有人可以帮助我,我将不胜感激,非常感谢。
答案 0 :(得分:0)
经过小时调试&gt;&gt;&gt;我最终发现了这个BUG!
在线程ReceiveFileSendRequestThread()
中,Boolean
变量okToSend
在第一次接收来自第二个设备的请求时为空,当第二个设备取消请求时,oKtoSend
将设置为{{ 1}},因此每当第二个设备尝试发送另一个文件时,变量notosend
将始终具有先前分配的值。所以我只是在okToSend
循环之前添加okToSend = null;
,现在工作正常。