2012-09-24 123 views
1

我的应用程序具有UI(使用活动)和服务(使用IntentService实施)。该服务用于向远程服务器发送数据(同步,使用NetworkStream.Write)以及更新传输状态到UI(使用广播接收器方法实现)。适用于Android的Mono - 活动服务调用崩溃

这里是我的问题:

  • 的应用程序正常工作,如果用于NetworkStream.Write缓冲区的大小为11 KB或更少。然而,如果缓冲区的大小大于11 KB,比如20 KB(为了发送jpg图像需要这个大小),那么服务可以保持正常工作(通过日志文件验证),但是UI它消失了(类似于设备的后退按钮被按下),我找不到恢复它的方法。其中重要的是要指出,在这种情况下,Activity不会进入OnStop()也不会OnDestroy()状态。

  • 起初我以为这会是一些应用程序无响应由于服务器延迟导致的相关问题,但约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

不运行首先有一件事:在我给出答案之前,我会评论这个问题来澄清一件事,但不幸的是,我还没有足够的声望。

我会问的事情是:为什么你需要有一个大于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图像并发布到我的服务器。

+0

Hi Schlangi!这绝对是要走的路:-)!干杯! – HectorB

+0

@HectorB嘿,很好,我很高兴能帮上忙。 – Schlangi

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

注意:一种服务,它的托管过程中 服务的主线程中运行不创建自己的线程,并在单独 过程

+0

嗨莫多,感谢您的及时答复。我正在处理一些传统的后台系统,它只接受TCP/IP级别的特定于格式的字节流,所以http通信不会成为一种选择。关于服务实现,我使用的是一种我不太熟悉的服务类型,IntentService,它应该已经在主线程中做了异步工作:http://developer.android.com/reference/android/app/IntentService.html – HectorB