2015-12-07 43 views
1

我已經實現了一個viewpager,其中包含兩個片段,每個片段都發送一個GET請求以抽籤。由於這兩個片段是同時加載的,所以在volley中使用默認請求隊列時,會出現單個客戶端連接管理器錯誤。這裏是我的駐留在一個單獨的請求隊列代碼:Android volley - 來自viewpager片段的併發/並行獲取請求

client = new DefaultHttpClient(); 
mRequestQueue = Volley.newRequestQueue(ctx.getApplicationContext(), new HttpClientStack(client)); 

這將導致以下錯誤:

W/SingleClientConnManager﹕ Invalid use of SingleClientConnManager:connection still allocated. 
Make sure to release the connection before allocating another one 

我切換到使用ThreadedConnectionManager,它似乎已經解決了這個問題。以下解決方案:

DefaultHttpClient mDefaultHttpClient = new DefaultHttpClient(); 

final ClientConnectionManager mClientConnectionManager = mDefaultHttpClient.getConnectionManager(); 
final HttpParams mHttpParams = mDefaultHttpClient.getParams(); 
final ThreadSafeClientConnManager mThreadSafeClientConnManager = new ThreadSafeClientConnManager(mHttpParams, mClientConnectionManager.getSchemeRegistry()); 

mDefaultHttpClient = new DefaultHttpClient(mThreadSafeClientConnManager, mHttpParams); 

final HttpStack httpStack = new HttpClientStack(mDefaultHttpClient); 

mRequestQueue = Volley.newRequestQueue(ctx.getApplicationContext(), httpStack); 

我的問題是:是否有解決的更好的方法這個問題,或者是我的解決方案是否合適?根據我的用例,這裏最好的做法是什麼?

+0

您是否每次都在製作newRequestQueue?或者它只是第一次創建? –

+0

它只創建一次 –

+0

試圖幫助。請看答案。 –

回答

0

我最近有類似的問題,認爲這會有所幫助。

import android.app.Application; 
import android.text.TextUtils; 

import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.toolbox.ImageLoader; 
import com.android.volley.toolbox.Volley; 
import com.example.shinetechnolab.testmaterial.utils.LruBitmapCache; 

public class AppController extends Application { 

    public static final String TAG = AppController.class 
      .getSimpleName(); 

    private RequestQueue mRequestQueue; 
    private ImageLoader mImageLoader; 

    private static AppController mInstance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mInstance = this; 
    } 

    public static synchronized AppController getInstance() { 
     return mInstance; 
    } 

    public RequestQueue getRequestQueue() { 
     if (mRequestQueue == null) { 
      mRequestQueue = Volley.newRequestQueue(getApplicationContext()); 
     } 

     return mRequestQueue; 
    } 

    public ImageLoader getImageLoader() { 
     getRequestQueue(); 
     if (mImageLoader == null) { 
      mImageLoader = new ImageLoader(this.mRequestQueue, 
        new LruBitmapCache()); 
     } 
     return this.mImageLoader; 
    } 

    public <T> void addToRequestQueue(Request<T> req, String tag) { 
     // set the default tag if tag is empty 
     req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); 
     getRequestQueue().add(req); 
    } 

    public <T> void addToRequestQueue(Request<T> req) { 
     req.setTag(TAG); 
     getRequestQueue().add(req); 
    } 

    public void cancelPendingRequests(Object tag) { 
     if (mRequestQueue != null) { 
      mRequestQueue.cancelAll(tag); 
     } 
    } 
} 

然後添加到RequestQueue。

AppController.getInstance().addToRequestQueue(jsonObjectRequest, 
       tag_json_arry);