2013-11-15 30 views
9

我想從我的服務器發送一個圖像與我的發佈數據到我的服務器。爲了完成這個我base 64編碼我的圖像字符串,並使用android volley庫發送它。儘管如此,這會造成問題。出於某種原因,它有時會發送兩次帖子,我無法弄清楚原因。以下是被調用來發送發佈請求的功能。我在String url = "http://domain.com/ajax_ws.php";,然後在protected Map<String, String> getParams() {打破分數我發現是String url = ...只被調用一次,但當它發送兩個時,protected Map...被調用兩次。我找不到有關android volley的任何文檔,所以我不知道爲什麼會發生這種情況。位圖被調整大小,以便圖像字符串始終保持在100k到200k之間。我想也許這是一個尺寸問題,但我的服務器正在接收圖像和解碼他們,一切都很好。Android凌空發送信息兩次,圖像上傳

public void Sharing() { 

    pd = ProgressDialog.show(getParent(), null, "Please Wait..."); 
    final String caption = mEtMessage.getText().toString(); 
    RequestQueue queue = Volley.newRequestQueue(this); 
    String url = "http://domain.com/ajax_ws.php"; 
    StringRequest postRequest = new StringRequest(
      Request.Method.POST, 
      url, 
      new MyStringListener(), 
      new MyErrorListener() 
    ) { 
     @Override 
     protected Map<String, String> getParams() { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("token", "secretToken"); 
      params.put("mode", "createVoucher"); 
      params.put("user_id", ActivityLogin.id); 
      params.put("deal_id", ActivitySharing.id_deal); 
      params.put("user_id_company", ActivityRestaurantDetails.res.getId()); 
      params.put("user_img", pathImage); 
      params.put("caption", caption); 
      params.put("company_id", ActivityRestaurantDetails.res.getId()); 
      return params; 

     } 
    }; 
    queue.add(postRequest); 
} 

任何想法爲什麼會發生這種情況?

+0

只是一個建議:這將是很好的提取匿名'Response.Listener'來分離(內部?)類來簡化事情,並使您的代碼更具可讀性。它現在非常混亂,並使您的屏幕的一半覆蓋縮進。 –

+0

@Secator謝謝,我會這樣做的,這段代碼已經通過了絞刑機,它遍佈各處。 – tomjung

+0

我正面臨着確切的問題。我的進一步調查表明,它處理任何緩慢的連接。我試圖調試Volley庫,並發現了一個模式,該post模式是由BasicNetwork類中的SocketTimeoutException在「performRequest(請求請求)」方法​​中引起的。每次發生異常時,都會發生雙重帖子。不幸的是我沒有任何解決方案。讓我知道你的想法。而且,我沒有看到這與RetryPolicy相關。你放在RetryPolicy上的任何數字都不會影響解決這個問題。 –

回答

4

Volley使用RetryPolicy處理請求,默認情況下,該請求通過指數回退算法發送請求3次。它可能是一些請求失敗並重試?第一次請求的調用是否有錯誤/成功日誌?

+0

你是對的。我做了一些進一步的測試,並且它發生在更大的圖像上。這會產生另一個問題,那就是如何處理這個問題。我有一些想法,但缺乏這方面的經驗,所以我發佈了另一個問題[這裏](http://stackoverflow.com/questions/20011775/sending-image-via-android-volley-with-php)謝謝你的迴應! – tomjung

+0

要了解重試策略,請參閱此[重試策略](https://github.com/smanikandan14/Volley-demo)'。'重試策略'包含3個參數'RequestTimeOut,Retries,Multiplier'.'RequestTimeOut'是時間'Volley'庫等待'Http'響應。在那段時間裏,如果沒有響應,它會產生相同的「Http請求」。重試次數按照「重試次數」值進行。如果「重試策略= 1」,並且超過了「Request TimeOut」,它只會使相同的「Http請求」只有一次。 – laaptu

7

我能夠通過兩種方式解決這個問題。

首先建議Snicolas。更改了RetryPolicy。 只需將超時值設置爲默認超時的兩倍。工作很好。您也可以嘗試其他值。

request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

另一種方式是通過在openConnection方法HurlStack類設置connection.setChunkedStreamingMode(0);

我創造我RequestQueue這樣requestQueue = Volley.newRequestQueue(context, new HurlStack());

希望它能幫助:)

3

以下修復爲我工作。那些使用HTTPS和排球的人應該嘗試一下。

DefaultRetryPolicy retryPolicy = new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
     jsr.setRetryPolicy(retryPolicy); 

希望這會幫助您解決問題。

6

解決方法是編輯重試策略,這也在這裏解釋:(http://www.techstricks.com/avoid-multiple-requests-when-using-volley/)。

但是,如果覆蓋不適合你,那麼你可能會喜歡重新訪問你的凌空緩存邏輯。由於凌空緩存中的軟ttl,結果從緩存中傳遞,同時它排隊另一個網絡請求,這也會返回結果。因此,單一的請求,但兩個不同的結果。

1

試試這個。

JsonObjectRequest jsonObjRequest = new JsonObjectRequest(...); 
jsonObjRequest.setRetryPolicy(new DefaultRetryPolicy(0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
1

將重試次數編輯爲1.它爲我工作。

stringRequest.setRetryPolicy(new 
      DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, 1, 
          DefaultRetryPolicy.DEFAULT_BACKOFF_MULT) 
       );