1

ファイルアップロードアプリを書いています。asynメソッドを使用してサーバーに接続し、ファイル(apache http)をアップロードできます。
サーバーは接続数の制限を100に設定しました。接続が60秒間続く場合、接続を切断するために接続タイムアウトを設定したいと思います。

フローは次のとおりです。
(1)Androidクライアントがサーバーへの接続を確立します。(60秒間カウントを開始)
(2)60秒間接続がまだ有効な場合は、Androidクライアントから切断します

HttpParamsにタイムアウトを設定しても機能しないことはわかっています。どうすればいいのかわからない。
誰もがそれを行う方法のアイデアを持っていますか?任意の解決策や提案を歓迎します。ありがとう!

ファイルをアップロードする方法のコードスニペットは次のとおりです。

try
{
        HttpParams httpParameters = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParameters, 60000);
        HttpConnectionParams.setSoTimeout(httpParameters, 60000);


        HttpClient client =  new DefaultHttpClient(httpParameters);  
        ...
        ByteArrayBody bab = new ByteArrayBody(byteArray, "photo.jpg");
        entity.addPart("photo", bab);
        httpPost.setEntity(entity);   

        startTime = System.currentTimeMillis();


        //ClientConnectionRequest connRequest = new ManagedClientConnection();
        //httpPost.setConnectionRequest((ClientConnectionRequest) connRequest.getConnection(3000, TimeUnit.MILLISECONDS));

        HttpResponse response = client.execute(httpPost, localContext);

        Handler mHandler = new Handler();

        BufferedReader reader = new BufferedReader(new InputStreamReader( response.getEntity().getContent(), "UTF-8"));  
        String result = "";  
        String tmp = "";



        while ((tmp = reader.readLine()) != null)
        {
            result += tmp;
        }
        reader.close();

        return result;

    } catch (Exception e) {  
        Log.e(TAG, "error time = " + (System.currentTimeMillis() - startTime));
        Log.e("httpUploadHandler", "Some error came up"); 
        Log.e("httpUploadHandler", e.toString()); 

    }   


次の電話で接続を切断できます。

client.getConnectionManager().shutdown();

しかし、生きている接続を切断するために60秒を数えるにはどうすればよいですか?また、いつ接続が確立されたかを知ることはできますか?

4

2 に答える 2

2

ソケットのタイムアウトを設定してみましたか? 接続タイムアウトとは異なります。

params.setParameter( HttpConnectionParams.SO_TIMEOUT, 60000 );

ここでparamsは のインスタンスでありBasicHttpParams、 のコンストラクタに渡されDefaultHttpClientます。

于 2012-04-27T16:14:18.963 に答える
1

アクティビティでハンドラーを使用してジョブを実行します。以下のコードはあなたにアイデアを与えるでしょう:

 private ShutDownHandler mRedrawHandler = new ShutDownHandler(); 

     class ShutDownHandler extends Handler {  
            @Override  
            public void handleMessage(Message msg) {  
         client.getConnectionManager().shutdown();
            }  

            public void doJob(long delayMillis) {  
              this.removeMessages(0);  
              sendMessageDelayed(obtainMessage(0), delayMillis);  
            }  
          };  

メインスレッドからmRedrawHandler.doJob(60000)を呼び出します。

于 2012-04-27T17:03:05.817 に答える