
com.koushikdutta.ion.Ion Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ion Show documentation
Show all versions of ion Show documentation
Android Asynchronous Networking Made Easy
package com.koushikdutta.ion;
import android.annotation.TargetApi;
import android.app.Fragment;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import android.widget.ImageView;
import com.google.gson.Gson;
import com.koushikdutta.async.AsyncServer;
import com.koushikdutta.async.future.Future;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.async.http.AsyncHttpClient;
import com.koushikdutta.async.http.AsyncHttpRequest;
import com.koushikdutta.async.http.ResponseCacheMiddleware;
import com.koushikdutta.async.http.libcore.RawHeaders;
import com.koushikdutta.async.util.FileCache;
import com.koushikdutta.async.util.FileUtility;
import com.koushikdutta.async.util.HashList;
import com.koushikdutta.ion.bitmap.BitmapInfo;
import com.koushikdutta.ion.bitmap.IonBitmapCache;
import com.koushikdutta.ion.builder.Builders;
import com.koushikdutta.ion.builder.FutureBuilder;
import com.koushikdutta.ion.builder.LoadBuilder;
import com.koushikdutta.ion.cookie.CookieMiddleware;
import com.koushikdutta.ion.loader.AssetLoader;
import com.koushikdutta.ion.loader.AsyncHttpRequestFactory;
import com.koushikdutta.ion.loader.ContentLoader;
import com.koushikdutta.ion.loader.FileLoader;
import com.koushikdutta.ion.loader.HttpLoader;
import com.koushikdutta.ion.loader.PackageIconLoader;
import com.koushikdutta.ion.loader.ResourceLoader;
import com.koushikdutta.ion.loader.VideoLoader;
import org.apache.http.conn.ssl.BrowserCompatHostnameVerifier;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by koush on 5/21/13.
*/
public class Ion {
static final Handler mainHandler = new Handler(Looper.getMainLooper());
static int availableProcessors = Runtime.getRuntime().availableProcessors();
static ExecutorService ioExecutorService = Executors.newFixedThreadPool(4);
static ExecutorService bitmapExecutorService = availableProcessors > 2 ? Executors.newFixedThreadPool(availableProcessors - 1) : Executors.newFixedThreadPool(1);
static HashMap instances = new HashMap();
/**
* Get the default Ion object instance and begin building a request
* @param context
* @return
*/
public static LoadBuilder with(Context context) {
return getDefault(context).build(context);
}
/**
* the default Ion object instance and begin building a request
* @param fragment
* @return
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
public static LoadBuilder with(Fragment fragment) {
return getDefault(fragment.getActivity()).build(fragment);
}
/**
* the default Ion object instance and begin building a request
* @param fragment
* @return
*/
public static LoadBuilder with(android.support.v4.app.Fragment fragment) {
return getDefault(fragment.getActivity()).build(fragment);
}
/**
* Get the default Ion object instance and begin building a request
* with the given uri
* @param context
* @param uri
* @return
*/
@Deprecated
public static Builders.Any.B with(Context context, String uri) {
return getDefault(context).build(context, uri);
}
/**
* Get the default Ion object instance and begin building an operation
* on the given file
* @param context
* @param file
* @return
*/
@Deprecated
public static FutureBuilder with(Context context, File file) {
return getDefault(context).build(context, file);
}
/**
* Get the default Ion instance
* @param context
* @return
*/
public static Ion getDefault(Context context) {
return getInstance(context, "ion");
}
/**
* Get the given Ion instance by name
* @param context
* @param name
* @return
*/
public static Ion getInstance(Context context, String name) {
if (context == null)
throw new NullPointerException("Can not pass null context in to retrieve ion instance");
Ion instance = instances.get(name);
if (instance == null)
instances.put(name, instance = new Ion(context, name));
return instance;
}
/**
* Create a ImageView bitmap request builder
* @param imageView
* @return
*/
public static Builders.IV.F extends Builders.IV.F>> with(ImageView imageView) {
return getDefault(imageView.getContext()).build(imageView);
}
AsyncHttpClient httpClient;
CookieMiddleware cookieMiddleware;
ResponseCacheMiddleware responseCache;
FileCache storeCache;
HttpLoader httpLoader;
ContentLoader contentLoader;
ResourceLoader resourceLoader;
AssetLoader assetLoader;
VideoLoader videoLoader;
PackageIconLoader packageIconLoader;
FileLoader fileLoader;
String logtag;
int logLevel;
Gson gson;
String userAgent;
ArrayList loaders = new ArrayList();
String name;
HashList> bitmapsPending = new HashList>();
Config config = new Config();
IonBitmapCache bitmapCache;
Context context;
IonImageViewRequestBuilder bitmapBuilder = new IonImageViewRequestBuilder(this);
private Ion(Context context, String name) {
httpClient = new AsyncHttpClient(new AsyncServer("ion-" + name));
httpClient.getSSLSocketMiddleware().setHostnameVerifier(new BrowserCompatHostnameVerifier());
this.context = context = context.getApplicationContext();
this.name = name;
File ionCacheDir = new File(context.getCacheDir(), name);
try {
responseCache = ResponseCacheMiddleware.addCache(httpClient, ionCacheDir, 10L * 1024L * 1024L);
}
catch (IOException e) {
IonLog.w("unable to set up response cache, clearing", e);
FileUtility.deleteDirectory(ionCacheDir);
try {
responseCache = ResponseCacheMiddleware.addCache(httpClient, ionCacheDir, 10L * 1024L * 1024L);
}
catch (IOException ex) {
IonLog.w("unable to set up response cache, failing", e);
}
}
storeCache = new FileCache(new File(context.getFilesDir(), name), Long.MAX_VALUE, false);
// TODO: Support pre GB?
if (Build.VERSION.SDK_INT >= 9)
addCookieMiddleware();
httpClient.getSocketMiddleware().setConnectAllAddresses(true);
httpClient.getSSLSocketMiddleware().setConnectAllAddresses(true);
bitmapCache = new IonBitmapCache(this);
configure()
.addLoader(videoLoader = new VideoLoader())
.addLoader(packageIconLoader = new PackageIconLoader())
.addLoader(httpLoader = new HttpLoader())
.addLoader(contentLoader = new ContentLoader())
.addLoader(resourceLoader = new ResourceLoader())
.addLoader(assetLoader = new AssetLoader())
.addLoader(fileLoader = new FileLoader());
}
public static ExecutorService getBitmapLoadExecutorService() {
return bitmapExecutorService;
}
public static ExecutorService getIoExecutorService() {
return ioExecutorService;
}
/**
* Begin building an operation on the given file
* @param context
* @param file
* @return
*/
@Deprecated
public FutureBuilder build(Context context, File file) {
return new IonRequestBuilder(ContextReference.fromContext(context), this).load(file);
}
/**
* Begin building a request with the given uri
* @param context
* @param uri
* @return
*/
@Deprecated
public Builders.Any.B build(Context context, String uri) {
return new IonRequestBuilder(ContextReference.fromContext(context), this).load(uri);
}
/**
* Begin building a request
* @param context
* @return
*/
public LoadBuilder build(Context context) {
return new IonRequestBuilder(ContextReference.fromContext(context), this);
}
/**
* Begin building a request
* @param fragment
* @return
*/
public LoadBuilder build(Fragment fragment) {
return new IonRequestBuilder(new ContextReference.FragmentContextReference(fragment), this);
}
/**
* Begin building a request
* @param fragment
* @return
*/
public LoadBuilder build(android.support.v4.app.Fragment fragment) {
return new IonRequestBuilder(new ContextReference.SupportFragmentContextReference(fragment), this);
}
/**
* Create a builder that can be used to build an network request
* @param imageView
* @return
*/
public Builders.IV.F extends Builders.IV.F>> build(ImageView imageView) {
if (Thread.currentThread() != Looper.getMainLooper().getThread())
throw new IllegalStateException("must be called from UI thread");
bitmapBuilder.reset();
bitmapBuilder.ion = this;
return bitmapBuilder.withImageView(imageView);
}
int groupCount(Object group) {
FutureSet members;
synchronized (this) {
members = inFlight.get(group);
}
if (members == null)
return 0;
return members.size();
}
private Runnable processDeferred = new Runnable() {
@Override
public void run() {
if (BitmapFetcher.shouldDeferImageView(Ion.this))
return;
ArrayList deferred = null;
for (String key: bitmapsPending.keySet()) {
Object owner = bitmapsPending.tag(key);
if (owner instanceof DeferredLoadBitmap) {
DeferredLoadBitmap deferredLoadBitmap = (DeferredLoadBitmap)owner;
if (deferred == null)
deferred = new ArrayList();
deferred.add(deferredLoadBitmap);
}
}
if (deferred == null)
return;
int count = 0;
for (DeferredLoadBitmap deferredLoadBitmap: deferred) {
bitmapsPending.tag(deferredLoadBitmap.key, null);
bitmapsPending.tag(deferredLoadBitmap.fetcher.bitmapKey, null);
deferredLoadBitmap.fetcher.execute();
count++;
// do MAX_IMAGEVIEW_LOAD max. this may end up going over the MAX_IMAGEVIEW_LOAD threshhold
if (count > BitmapFetcher.MAX_IMAGEVIEW_LOAD)
return;
}
}
};
void processDeferred() {
mainHandler.removeCallbacks(processDeferred);
mainHandler.post(processDeferred);
}
/**
* Cancel all pending requests associated with the request group
* @param group
*/
public void cancelAll(Object group) {
FutureSet members;
synchronized (this) {
members = inFlight.remove(group);
}
if (members == null)
return;
for (Future future: members.keySet()) {
if (future != null)
future.cancel();
}
}
void addFutureInFlight(Future future, Object group) {
if (group == null || future == null || future.isDone() || future.isCancelled())
return;
FutureSet members;
synchronized (this) {
members = inFlight.get(group);
if (members == null) {
members = new FutureSet();
inFlight.put(group, members);
}
}
members.put(future, true);
}
/**
* Cancel all pending requests
*/
public void cancelAll() {
ArrayList
© 2015 - 2025 Weber Informatics LLC | Privacy Policy