簡體   English   中英

適用於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM