我的应用程序有一个UI(使用 Activity 实现)和一个服务(使用 IntentService 实现)。该服务用于将数据(同步,使用 NetworkStream.Write )发送到远程服务器,以及将传输状态更新到UI(使用 Broadcast Receiver 方法实现) )。
这是我的问题:
如果用于NetworkStream.Write的缓冲区大小为11 KB或更小,则应用程序可以正常工作。
但是,如果缓冲区的大小大于11 KB,比如20 KB(发送jpg图像需要这个大小),那么服务保持正常工作(通过日志文件验证),尽管如此UI已经消失(类似于设备的后退按钮被推动),我无法找到将其恢复的方式。重要的是要指出,在这种情况下,Activity不会进入 OnStop()或 OnDestroy()状态。
起初我认为由于服务器延迟会导致一些 ApplicationNotResponding 相关问题,但UI会在大约5秒后崩溃。
此外,这仅适用于硬件版本。模拟器版本工作正常。
// 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();
答案 0 :(得分:0)
您可能想要更改应用程序以使用asynctask并查看指南: http://developer.android.com/training/basics/network-ops/connecting.html
网络运营可能涉及不可预测的延迟。为防止此操作导致糟糕的用户体验,请始终在UI的单独线程上执行网络操作。
由于android 4.0,因此无法在与UI线程相同的线程中执行与网络相关的任务。还要清楚http://developer.android.com/guide/components/services.html
警告:服务在其托管进程的主线程中运行 - service不会创建自己的线程,也不会单独运行 过程
答案 1 :(得分:0)
首先要做的一件事:在我给出答案之前,我会在一个问题上澄清一个问题,但遗憾的是我还没有足够的声誉。
我要求的是:为什么你需要一个大于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图像并发布到我的服务器。