【发布时间】:2011-07-19 21:51:42
【问题描述】:
如何启动一个在后台运行但响应会立即发送给用户的线程?
我正在尝试从 Android 设备上传文件。虽然上传过程正常,但我想告诉用户,一旦文件从他端上传,该过程就完成了。
我检查了对 ServletFileUpload.parseRequest() 的调用需要很长时间。
ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
List items = uploadHandler.parseRequest(request);
所以基本上我正在寻找一种方法来告诉用户“嘿,你已经完成了你的工作”,现在轮到 servlet 来完成所有处理了。
但我不能,因为 parseRequest 阻塞。
我错了,因为它实际上是由设备发送的,所以它阻塞了?
在安卓上上传:
while (bytesRead > 0)
{
task.myPublishProgress(totalBytesRead, fileSize);
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
totalBytesRead+= bytesRead;
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// close streams
fileInputStream.close();
dos.flush();
Log.i(TAG ,"Database file with name " + this.fileName + " has been successfully written");
InputStream is = conn.getInputStream();
// retrieve the response from server
int ch;
StringBuilder b = new StringBuilder();
while( ( ch = is.read() ) != -1 ){
b.append( (char)ch );
}
dos.close();
在服务器上处理:
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory ();
ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
/*
* Parse the request
*/
System.out.println("parsing the request....");
**List items = uploadHandler.parseRequest(request);**
FileItem item = (FileItem) items.get(0);
fileName = item.getName();
File file = new File(destinationDir, fileName);
item.write(file);
我希望 servlet 在 parseRequest 上不要太阻塞,而是可能在一个线程中处理它,并将响应发送给客户端。
谢谢
【问题讨论】:
-
您能否提供更多详细信息,例如您想做什么以及您在哪里受到打击?
-
@anubhava 查看已编辑的问题。如果您想了解更多详情,请告诉我。
-
@kkudi:谢谢,我对 Android 编码了解不多,但设备向您的服务器发送 AJAX 请求是一种选择吗?这样您就不必在服务器端构建此解决方案。
-
设备正在发送 HttpURLConnection,将数据写入服务器并等待响应。
-
好的,在这种情况下,您可以选择使用异步 http 客户端吗?请查看github.com/AsyncHttpClient/async-http-client
标签: java android multithreading servlets httpclient