2012-04-27 94 views
1

我正在寫一個文件上傳應用程序。我可以使用asyn方法連接到服務器並上傳文件(apache http)。
服務器已將連接數限制設置爲100.如果連接持續60秒,我想要設置連接超時以斷開連接。

以下是流程:
(1)Android客戶端建立與服務器的連接。 (開始計數爲60s)
(2)如果連接在60s後仍然存在,則斷開與Android客戶端的連接是否可以設置超時斷開建立的http連接?

我知道爲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秒到斷開活動連接?此外,是否有可能知道何時建立連接?

回答

1

在您的活動中使用Handler來完成這項工作。下面的代碼會給你一個想法:從主線程

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)。

+0

我的發送文件方法在擴展AsyncTask 的類中。我得到'不能創建處理程序內部線程沒有調用Looper.prepare()'的錯誤。是否有任何解決方法來執行您的建議?感謝 – 2012-04-27 17:11:31

+0

嘗試將此代碼放入AsyncTask的onPreExecute()中。 – Akhil 2012-04-27 17:17:31

+0

謝謝,它的工作原理。我把'httpAsync.mRedrawHandler.doJob(60000);'之前「HttpResponse響應= client.execute(httpPost,localContext);」。但它不是我想要的100%。實際上,我想在連接建立成功後啓動'doJob(60000)'。有沒有可能檢測到它? – 2012-04-27 17:23:49

2

您是否嘗試過設置套接字超時?它不同於連接超時。

params.setParameter(HttpConnectionParams.SO_TIMEOUT, 60000); 

其中paramsBasicHttpParams一個實例,它是通過成DefaultHttpClient構造。

+0

是的,我試過(我編輯了這個問題,並把代碼片段)。我認爲SO_TIMEOUT是丟失套接字連接的超時值。 – 2012-04-27 16:35:18

+0

實際上,我想在建立連接後60秒關閉連接。可能嗎?謝謝 – 2012-04-27 16:36:26

相關問題