2015-12-07 2 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); 
Смежные вопросы