1. 程式人生 > >Android Volley 網路併發 監聽網路佇列完成

Android Volley 網路併發 監聽網路佇列完成

先說明一下原理:

1.利用反射機制獲取 RequestQueue 佇列中 mCurrentRequests 當前請求的集合,如果size==0, 則說明併發性網路請求已完成,為了保證準確性,建議給需要監聽的網路請求設定tag,並利用tag進行過濾

2.利用定時迴圈執行緒進行動態取值

程式碼如下:

public static void whetherRequestCompleted(Context context,RequestSchedule requestSchedule){
    whetherRequestCompleted(context,null,requestSchedule);
}

public static void 
whetherRequestCompleted(final Context context, final Object requestTag, final RequestSchedule requestSchedule){ final Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { if
(msg.what==0){ requestSchedule.completed(); }else if(msg.what==1){ requestSchedule.failed((Exception)msg.obj); } } }; final Timer timer = new Timer(); timer.schedule(new TimerTask() { int num = 0; public void
run() { try { ++this.num; boolean e = true; RequestQueue requestQueue = VolleyManager.getRequestQueue(context); Field field = requestQueue.getClass().getDeclaredField("mCurrentRequests"); field.setAccessible(true); Set set = (Set)field.get(requestQueue); if(set!=null&&set.size()>0){ Iterator var5 = set.iterator(); while(var5.hasNext()) { Request r = (Request)var5.next(); if(r!=null&&r.getTag()!=null){ if(r.getTag().equals(requestTag == null?context.getClass().getName():requestTag)) { e = false; } } } } if(e) { Message message=new Message(); message.what=0; message.obj=null; handler.sendMessage(message); timer.cancel(); return; } if((long)(this.num * 1000) > VolleyManager.mTimeoutMs) { Message message=new Message(); message.what=1; message.obj=new TimeoutException(); handler.sendMessage(message); timer.cancel(); return; } } catch (NoSuchFieldException var7) { Message message=new Message(); message.what=1; message.obj=var7; handler.sendMessage(message); timer.cancel(); } catch (IllegalAccessException var8) { Message message=new Message(); message.what=1; message.obj=var8; handler.sendMessage(message); timer.cancel(); } catch (ConcurrentModificationException var9) { } } }, 0L, 1000L); } public interface RequestSchedule{ abstract void completed(); abstract void failed(Exception e); }

說明:

1, 第一個方法中tag==null, 本人在程式碼用預設使用當前頁面的類名進行過濾(如果不使用,可以忽略)

2. 使用handler 是為了保證在主執行緒用呼叫回撥介面可以進行UI操作

3. mTimeoutMs 是為了避免死鎖問題