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

问题描述 投票:1回答:2

我的应用程序有一个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();
android android-activity xamarin.android streamwriter
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图像并发布到我的服务器。


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

警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行

© www.soinside.com 2019 - 2024. All rights reserved.