我的应用程序有一个UI(用Activity实现)和一个服务(用IntentService实现)。该服务用于将数据(同步,使用NetworkStream.Write)发送到远程服务器以及将传输状态更新到UI(使用Broadcast Receiver方法实现)。
这是我的问题:
// SEND STREAM:
Byte[] outStream = new Byte[20000];
// -- Set up TCP connection: --
TcpClient ClientSock = new TcpClient();
ClientSock.Connect("myserver.com", 5555);
NetworkStream serverStream = ClientSock.GetStream();
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
// . . .
// RECEIVE STREAM:
inStream.Initialize(); // Clears any previous value.
int nBytesRead = 0;
nBytesRead = serverStream.Read(inStream, 0, 1024);
// -- Closing communications socket: --
ClientSock.Close();
首先要说的是:在我给出答案之前,我会在一个问题上澄清一个问题,但不幸的是我还没有足够的声誉。
我要求的是:为什么你需要一个大于11k的缓冲区来发送JPG图像?
我几乎在一个(异步)任务中使用260k的图像执行相同的操作,但缓冲区为10240字节。工作没有困难。
byte[] buffer = new byte[10240];
for (int length = 0; (length = in.read(buffer)) > 0;) {
outputStream.write(buffer, 0, length);
outputStream.flush();
bytesWritten += length;
progress = (int) ((double) bytesWritten * 100 / totalBytes);
publishProgress();
}
outputStream.flush();
我使用这部分从资源或SD读取JPG图像并发布到我的服务器。
那么您可能想要更改您的应用程序以使用asynctask并查看指南:http://developer.android.com/training/basics/network-ops/connecting.html
网络运营可能涉及不可预测的延迟。为防止此操作导致糟糕的用户体验,请始终在UI的单独线程上执行网络操作。
从android 4.0开始,在与UI线程相同的线程中执行网络相关任务是不可能的。也只是为了清楚http://developer.android.com/guide/components/services.html
警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行