[英]Cannot call 'SetContentView' on new activity - Android Mono
[英]Mono for Android - Activity crash upon service call
我的应用程序具有一个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();
好吧,您可能需要更改您的应用程序以使用asynctask并查看该指南: http : //developer.android.com/training/basics/network-ops/connecting.html
网络操作可能会涉及不可预测的延迟。 为防止这种情况导致不良的用户体验,请始终在与UI分开的线程上执行网络操作。
从android 4.0开始,就不可能在与UI线程相同的线程中执行与网络相关的任务。 同样也要明确http://developer.android.com/guide/components/services.html
警告:服务在其宿主进程的主线程中运行-该服务不会创建自己的线程,也不会在单独的进程中运行
首先要解决的一件事:在给出答案之前,我会先被评论这个问题以澄清一件事,但是不幸的是,我还没有足够的声誉。
我要问的是:为什么需要一个大于11k的缓冲区才能发送JPG图像?
我几乎在一个(异步)任务中以260k的映像执行了相同的操作,但是缓冲区为10240 Bytes。 工作没有困难。
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图像并将其发布到我的服务器上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.