1

私のアプリケーションには、UI(Activityで実装)とサービス(IntentServiceで実装)があります。このサービスは、データをリモートサーバーに送信し(同期、NetworkStream.Writeを使用)、UIへの送信ステータスを更新するために使用されます( Broadcast Receiverメソッドを使用して実装されます)。

これが私の問題です:

  • NetworkStream.Writeに使用されるバッファーのサイズが11KB以下の場合、アプリケーションは正しく機能します。

  • ただし、バッファのサイズが11 KBより大きい場合、たとえば20 KB(jpg画像を送信するために必要なこのサイズ)の場合、サービスは正常に機能し続けます(ログファイルで確認されます)が、UIはなくなります(デバイスの戻るボタンが押された場合)、デバイスを元に戻す方法が見つかりません。この場合、アクティビティはOnStop()またはOnDestroy()状態にならないことを指摘することが重要です。

  • 最初は、これはサーバーの遅延によるApplicationNotResponding関連の問題だと思いましたが、約5秒後にUIがクラッシュします。

  • さらに、これはハードウェアバージョンでのみ発生します。エミュレータバージョンは正常に動作します。

    // 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(); 
    
4

2 に答える 2

0

さて、非同期タスクを使用するようにアプリケーションを変更して、ガイドを参照することをお勧めします:http: //developer.android.com/training/basics/network-ops/connecting.html

ネットワーク操作には、予測できない遅延が含まれる場合があります。これによりユーザーエクスペリエンスが低下するのを防ぐために、常にUIとは別のスレッドでネットワーク操作を実行してください。

android 4.0以降、UIスレッドと同じスレッドでネットワーク関連のタスクを実行することはできません。また、明確にするためにhttp://developer.android.com/guide/components/services.html

注意:サービスはホスティングプロセスのメインスレッドで実行されます。サービスは独自のスレッドを作成せず、別のプロセスで実行されません。

于 2012-09-24T23:54:43.300 に答える
0

まず最初に、答えを出す前に1つのことを明確にするために質問にコメントを付けていたでしょうが、残念ながら私はまだ十分な評判を持っていません。

私が求めていたのは、JPG画像を送信するために11kを超えるバッファが必要なのはなぜですか。

私は、260kのイメージを使用して、1つの(非同期)タスクでほぼ同じことを実行しますが、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画像を読み取り、サーバーに投稿します。

于 2012-09-25T00:25:29.003 に答える