我有一个运行方法,它启动一个新线程,并希望在它结束后从它启动另一个方法,但这不起作用。在方法的最后,我放了一些打印输出语句,它们只显示了几次,就像我第一次加载 java 程序时一样。通常他们不显示。
我想知道为什么它们没有出现,并且有一种可靠的方法,例如在 AsyncTask 的 onPostExecute() 中的回调方法,我可以在 Java 线程上使用它。
不知道为什么打印输出语句没有显示 98% 的时间。有任何想法吗?
这里有点困惑。因为我认为文件将到达末尾,而while循环中的count变量将变为0或-1,然后while循环将结束并执行进程,它将退出while循环并继续线程。这没有发生,也没有意义。
我收到的带有此代码的文件是完整的,没有问题。但是我需要启动另一个线程方法来向 Android 客户端发送一条消息,告诉它文件已成功接收。
其余的代码
@Override
public void run() {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
DataInputStream dis = null;
int bufferSize = 0;
File file = new File("/Users/UserName/sampleFile.db");
// get input streams
try {
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bis = new BufferedInputStream(socket.getInputStream());
dis = new DataInputStream(bis);
} catch (IOException ex) {
Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
}
try {
bufferSize = socket.getReceiveBufferSize();
} catch (SocketException ex) {
Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
}
int fileSizeFromClient = 0;
long serialNumber = 0;
try {
fileSizeFromClient = dis.readInt();
serialNumber = dis.readLong();
} catch (IOException ex) {
Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
}
String serialString = String.valueOf(serialNumber);
System.out.println("filesize " + fileSizeFromClient);
System.out.println("serialNumber " + serialString);
System.out.println("bufferSize " + bufferSize);
int count = 0;
try {
bos.flush();
} catch (IOException ex) {
Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
}
byte[] buffer = new byte[fileSizeFromClient];
try {
while((count = dis.read(buffer)) > 0){
bos.write(buffer, 0, count);
if(count == -1){ // <-- this line does not help break out of loop
break;
}
}
System.out.println("size of file written " + buffer.length); // <-- does not print out
socket.close();
System.out.println("test out 1"); // <-- does not print out
} catch (IOException ex) {
Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("test out 2"); // <-- does not print out
} // end run
编辑:忘了提到这是针对 Java 桌面应用程序,而不是 Android,但它连接到的客户端是 Android 设备。任何文件的收发都没有问题,socket和TCP/IP文件联网没有问题