package io.codetail.client;
import android.os.Handler;
import android.os.Looper;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.otto.Bus;
import java.io.IOException;
import io.codetail.Constants;
import io.codetail.work.Job;
import io.codetail.work.Params;
import retrofit.RestAdapter;
import retrofit.client.Client;
public abstract class BaseNetworkJob<T> extends Job{
public static int PRIORITY_LOW = 0;
public static int PRIORITY_NORMAL = 1;
public static int PRIORITY_HIGH = 2;
private final static Handler sHandler = new Handler(Looper.getMainLooper());
boolean isCancelled;
public BaseNetworkJob(Params params) {
super(params);
isCancelled = false;
}
/**
* when job running before doing hard work
* update ui
*/
public abstract void onPreRunning();
/**
* do any hard works
*
* @return result of job
*/
public abstract T doBackgroundJob() throws IOException;
/**
* @param result of hard work network job
*/
public abstract void onJobPostResult(T result);
public boolean isCancelled(){
return isCancelled;
}
@Override
protected void onCancel() {
isCancelled = true;
}
@Override
public void onRun() throws Throwable {
sHandler.post(new OnPreRunning(this));
T result = doBackgroundJob();
sHandler.post(new OnPostRunning<T>(result, this));
}
public OkHttpClient getClient(){
return Constants.getOkHttpClient();
}
public Bus getEventBus(){
return Constants.getEventBus();
}
public static <T> T create(String endpoint, Class<T> service, Client client){
RestAdapter adapter = new RestAdapter.Builder()
.setEndpoint(endpoint)
.setLogLevel(RestAdapter.LogLevel.BASIC)
.setClient(client)
.build();
return adapter.create(service);
}
private static class OnPreRunning implements Runnable{
volatile BaseNetworkJob job;
public OnPreRunning(BaseNetworkJob job) {
this.job = job;
}
@Override
public void run() {
job.onPreRunning();
}
}
private static class OnPostRunning<T> implements Runnable{
volatile T object;
volatile BaseNetworkJob<T> job;
public OnPostRunning(T object, BaseNetworkJob<T> job) {
this.object = object;
this.job = job;
}
@Override
public void run() {
job.onJobPostResult(object);
}
}
}