2016-08-15 18 views
0

請求根據https://developer.android.com/training/volley/requestqueue.html#singleton 它是不鼓勵使用通過設置在Application.onCreate()的請求隊列Android的凌空Singleton模式如何添加/刪除基於標籤

的實施提供一個單獨的類的老辦法然而,下面看到的「新」更模塊化的方式不包含向請求添加標籤並使用這些標籤取消標籤的方法。

public class MySingleton { 
private static MySingleton mInstance; 
private RequestQueue mRequestQueue; 
private ImageLoader mImageLoader; 
private static Context mCtx; 

private MySingleton(Context context) { 
    mCtx = context; 
    mRequestQueue = getRequestQueue(); 

    mImageLoader = new ImageLoader(mRequestQueue, 
      new ImageLoader.ImageCache() { 
     private final LruCache<String, Bitmap> 
       cache = new LruCache<String, Bitmap>(20); 

     @Override 
     public Bitmap getBitmap(String url) { 
      return cache.get(url); 
     } 

     @Override 
     public void putBitmap(String url, Bitmap bitmap) { 
      cache.put(url, bitmap); 
     } 
    }); 
} 

public static synchronized MySingleton getInstance(Context context) { 
    if (mInstance == null) { 
     mInstance = new MySingleton(context); 
    } 
    return mInstance; 
} 

public RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 
     // getApplicationContext() is key, it keeps you from leaking the 
     // Activity or BroadcastReceiver if someone passes one in. 
     mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); 
    } 
    return mRequestQueue; 
} 

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

public ImageLoader getImageLoader() { 
    return mImageLoader; 
} 

}

如何去增加((在Application.onCreate))類似於從舊的方式下面的那些方法:

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); 
    } 
} 

回答

0

一無所知請求隊列已經改變在這方面。你只是從一個不同於Application類的單例中訪問它。標籤添加到請求相同的方式你總是會:

ImageRequest request = new ImageRequest(...); 
request.setTag(MY_TAG); 
MySingleton.getInstance(this).addToRequestQueue(request); 

- 編輯 -

進一步闡述:它是一樣的,如果你是從其他地方獲得的請求隊列對象。它仍然只是一個RequestQueue。

所以這個:

mRequestQueue.cancelAll(tag); 

變爲:

MySingleton.getRequestQueue().cancelAll(tag); 

這同樣適用於其他任何你以前有做的請求隊列。示例MySingleton類只是爲您保留請求隊列。它沒有改變它。

要取消絕對一切,不管是什麼標籤:

MySingleton.getRequestQueue().cancelAll(new RequestQueue.RequestFilter() { 
    @Override 
    public boolean apply(Request<?> request) { 
     return true; 
    } 
}); 
+0

沒有關於特定的標記刪除所有請求的例子,沒有甚至大約如果你想添加更多的移除請求 –

+1

任何實例便捷方法到MySingleton類,只需查看示例代碼中已存在的addToRequestQueue(...)方法。您所要做的就是編寫便捷方法,並對MySingleton擁有的RequestQueue對象執行任何操作。 – Turnsole

+0

@Turnsole你好,我有內存泄漏與齊射匿名類特別是回調監聽功能,然後我讀了關於「cancelALL」。我究竟在哪裏放置了「MySingleton.getRequestQueue()。cancelAll(tag);」它是否在「MySingleton.getInstance(this).addToRequestQueue(request)」之後的活動中;「 ? – Woppi