0

ファイルのアップロードを伴う Android アプリを作成しています。サーバー側のコードを実際に記述せずに、メモリ不足エラーの可能性についてコードをチェックする方法はありますか? はいの場合、説明してください。コードを以下に示します:-

private void sendToRemoteServer(){
         Socket client;
         FileInputStream fileInputStream;
         BufferedInputStream bufferedInputStream;
         OutputStream outputStream;

         try{
             client                 =   new Socket("10.0.2.2",444);
             byte[] myByteArray     =   new byte[(int)mFile.length()];
             fileInputStream        =   new FileInputStream(mFile);
             bufferedInputStream    =   new BufferedInputStream(fileInputStream);

             bufferedInputStream.read(myByteArray, 0, myByteArray.length); //read the file

             outputStream = client.getOutputStream();

             outputStream.write(myByteArray, 0, myByteArray.length); //write file to the output stream byte by byte
             outputStream.flush();
             bufferedInputStream.close();
             outputStream.close();
             client.close();
         }catch(UnknownHostException e) {
             e.printStackTrace();
            } catch (IOException e) {
             e.printStackTrace();
            }
    }
4

2 に答える 2

1

ファイル全体を一度にバイト配列にコピーする必要はありません。

これはより優れており、メモリの問題が発生することはありません (8 kB を超えるメモリを使用することはありません)。

byte[] myByteArray = new byte[8192];
int len;
...
while ((len = bufferedInputStream.read(mByteArray, 0, len)) != -1)
    outputStream.write(mByteArray, 0, len);
于 2013-06-14T13:18:41.877 に答える
0

はいあります。

これは依存性注入と呼ばれます: http://en.wikipedia.org/wiki/Dependency_injection

このインターフェースを作成します

public interface ISocket{
    void close():
    OutputStream getOutputStream();
}

そして、ソケットクラスがそれを継承していることを確認してください。

あなたのコンストラクターは

private void sendToRemoteServer(){
     ISocket client;

ローカルでテストしたい場合は、close メソッドと getOutputStream メソッドで必要なことを行う ISocket の実装を引数として渡すだけです。

于 2013-06-14T12:46:56.500 に答える