2012-09-24 75 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