1

我的应用程序有一个 UI(用Activity实现)和一个服务(用IntentService实现)。该服务用于将数据(同步,使用NetworkStream.Write)发送到远程服务器以及将传输状态更新到 UI(使用广播接收器方法实现)。

这是我的问题:

  • 如果用于 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(); 
    
4

2 回答 2

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 图像并发布到我的服务器。

于 2012-09-25T00:25:29.003 回答
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

注意:服务在其宿主进程的主线程中运行——服务不会创建自己的线程,也不会在单独的进程中运行

于 2012-09-24T23:54:43.300 回答