2015-12-07 28 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);