Mono for Android - 服务调用时Activity崩溃

时间:2012-09-24 23:47:57

标签: android android-activity xamarin.android streamwriter

我的应用程序有一个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(); 
    

2 个答案:

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