2013-12-19 76 views
35

我讀過一篇關於Volley的文章,我知道這是一個很棒的網絡庫。但我無法理解一件事。Volley和AsyncTask

所有的請求是否是異步任務?

當我想使用Volley發送asyncTask請求我需要在AsyncTask中放置Volley請求嗎? 還是應該打電話給Volley請求它已經是AsyncTask請求?

private class MyClass extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      // do Volley request 
     } 
} 

這是正確的做法嗎?

+3

它已經發生在後臺'異步'。你**不需要'AsyncTask' –

回答

52

您不需要在異步任務上運行Volly請求。

爲什麼:

他們管理上獨立的線程所有網絡相關的任務。 如果你仔細觀察圖書館項目,他們沒有看到異步任務。但他們智能地處理所有與網絡有關的任務。

檢查RequestQueue.java類Volly的主要包

我在這裏粘貼Java文檔。

/** 
* A request dispatch queue with a thread pool of dispatchers. 
* 
* Calling {@link #add(Request)} will enqueue the given Request for dispatch, 
* resolving from either cache or network on a worker thread, and then delivering 
* a parsed response on the main thread. 
*/ 

被修改:

成型請求

隨着排球,網絡通信由請求隊列進行管理。使用RequestQueue及其所有工具(尤其是緩存)的最佳方法是通過實例化一次並將其作爲單例保存。此時,您可以添加或取消請求,停止或啓動請求,並訪問響應緩存。

RequestQueue queue =Volley.newRequestQueue(this); 

一旦請求隊列已經被實例化的請求必須形成。這可以利用Volley庫中包含的幾種不同的「開箱即用」請求類或將Volley的請求類擴展到您自己的自定義請求中。已經包含在Volley中的請求類是String請求,JSON請求和Image Request。包含在Volley庫中的大多數請求類都使用與以下類似的構造函數。

參數傳遞到構造函數:

RequestMethod(GET,POST,刪除,ECT) * JSONObject的,將您的要求發佈 * - 一個可選的對象 ResponseListener - 在請求完成後您的數據將發送到哪裏 ErrorListener - 當您的請求出現問題時會告訴您什麼。

JsonObjectRequest request = JsonObjectRequest(Requestmethod, url, null, new ResponseListener(), new ErrorListener()); 

Listners接收響應:

成功響應監聽

private class ResponseListener implements Response.Listener{ 
    @Override 
    public void onResponse(JSONObject response){ 

    } 
} 

錯誤響應監聽

private class ErrorListener implements Response.ErrorListener{ 
    @Override 
    public void onErrorResponse(VolleyError error){ 

    } 
} 

Finaly將您的請求添加到請求隊列中,剩下的永不停息的任務將爲您處理。

撥打電話:

現在,我們已經取得了我們的請求和響應類,我們就可以添加請求隊列和檢索數據。爲此,我們只需將請求添加到隊列中。

queue.add(request); 

響應或錯誤將被傳遞到我們在請求中定義的響應/錯誤類。您可以一次向隊列中添加儘可能多的請求,並將響應發送到各自的響應/錯誤類別

+1

我經歷了很長時間的休息(幾年)後重新訪問了Android,並且我安裝了Android Studio,Googles官方Android IDE。我使用電子郵件/密碼登錄模板設置了一個新項目,並且登錄活動中的樣板代碼包含了一個「AsyncTask」,您應該在其中放置HTTP請求。這讓我感到困惑,這也是我引發這個問題的原因。我假設Google不打算在這種情況下使用Volley? – RTF

6

當您使用Volley時,無需將其與AsyncTask結合使用。它爲您提供另一個線程上的網絡資源。

Here是使用Volley的網絡調用的基本示例。正如你所看到的,所有的代碼都在Activity之內,而不需要定義AsyncTask

+6

不幸的是,你的答案中的鏈接被打破。 –

+0

如果我在註冊後上傳圖片,我的個人資料圖片會出現什麼情況。有一個示例YouTube教程,他使用它們兩個。 – RoCk

1

凌空無法裏面的AsyncTask插入,因爲

排球在其自身,這樣所有的網絡請求啓動後臺線程(或多個)執行關閉UI線程,這樣主要是你不需要再擴展的AsyncTask。當然,你必須小心取消旋轉或當用戶退出你的活動時的運行請求。 由於Volley主要用於Android中的次要網絡目的(主要用於DownloadManager)。它做類似AsyncTask Class的工作。在Volley中實現Singleton。 圖像也可以在Volley中發送。