package com.netease.nim.demo.common.infra;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
import android.text.TextUtils;
import com.netease.nim.uikit.common.util.log.LogUtil;
public abstract class ManagedTask extends ObservableTask {
private static final String TAG = "ManagedTask";
private static final String ENCLOSURE = "()";
private static AtomicInteger serial = new AtomicInteger();
private TaskManager taskManager;
private TaskObserver taskObserver;
private final TaskObserver getTaskObserver() {
if (taskObserver == null) {
taskObserver = new TaskObserver() {
@Override
public void onTaskResult(Task task, Object[] results) {
if (!cancelled()) {
onDepTaskResult(task, results);
}
}
@Override
public void onTaskProgress(Task task, Object[] params) {
if (!cancelled()) {
onDepTaskProgress(task, params);
}
}
};
}
return taskObserver;
}
private ArrayList<ManagedTask> links = new ArrayList<ManagedTask>();
/**
* on task result
* @param results
*/
protected void onTaskResult(Object[] results) {}
/**
* on task progress
* @param params
*/
protected void onTaskProgress(Object[] params) {}
/**
* on dependent task result
* @param task
* @param results
*/
protected void onDepTaskResult(Task task, Object[] results) {}
/**
* on dependent task progress
* @param task
* @param params
*/
protected void onDepTaskProgress(Task task, Object[] params) {}
/**
* on task result
* @param results
*/
@Override
protected final void onPublishResult(Object[] results) {
// self
if (!cancelled()) {
onTaskResult(results);
}
notifyTaskResult(results);
// links
synchronized (links) {
for (ManagedTask link : links) {
link.onPublishResult(results);
}
}
}
/**
* on task progress
* @param params
*/
@Override
protected final void onPublishProgress(Object[] params) {
// self
if (!cancelled()) {
onTaskProgress(params);
}
notifyTaskProgress(params);
// links
synchronized (links) {
for (ManagedTask link : links) {
link.onPublishProgress(params);
}
}
}
/**
* attach task manager
* @param taskManager
*/
/*package*/ final void attachTaskManager(TaskManager taskManager) {
this.taskManager = taskManager;
}
/**
* an same task has been scheduled
*
* @param task
*/
/*package*/ final void onSameTask(ManagedTask task) {
// link
task.link(this);
}
/**
* make task key
*
* @param task
* @param params
* @return
*/
/*package*/ static final String makeTaskKey(ManagedTask task, Object... params) {
String tag = task.getTaskTag();
String id = task.getTaskId();
String extraId = task.getTaskExtraId(params);
StringBuilder sb = new StringBuilder();
// tag
sb.append("T");
sb.append(ENCLOSURE.charAt(0));
sb.append(tag);
sb.append(ENCLOSURE.charAt(1));
// id
sb.append("I");
sb.append(ENCLOSURE.charAt(0));
sb.append(id);
sb.append(ENCLOSURE.charAt(1));
// extra id
if (!TextUtils.isEmpty(extraId)) {
sb.append("E");
sb.append(ENCLOSURE.charAt(0));
sb.append(extraId);
sb.append(ENCLOSURE.charAt(1));
}
return sb.toString();
}
/**
* get task tag
*
* @return task tag
*/
protected String getTaskTag() {
return getClass().getSimpleName();
}
/**
* get task id
*
* @return task id
*/
protected String getTaskId() {
return Integer.toString(serial.getAndIncrement());
}
/**
* get task extra id
*
* @param params
* @return
*/
protected String getTaskExtraId(Object... params) {
return null;
}
/**
* schedule task
*
* @param background
* @param task
* @param params
* @return task key
*/
protected String schedule(boolean background, ManagedTask task, Object... params) {
// register
task.registerObserver(getTaskObserver());
// execute
return taskManager.schedule(background, task, params);
}
/**
* reschedule self
*/
protected void reschedule() {
taskManager.reschedule(this);
}
/**
* cancel linked tasks recursively
*/
@Override
public void cancel() {
super.cancel();
synchronized (links) {
for (ManagedTask link : links) {
link.cancel();
}
}
}
/**
* link task
* @param task
*/
private final void link(ManagedTask task) {
trace("link " + dump(true));
synchronized (links) {
links.add(task);
}
}
private static final void trace(String msg) {
LogUtil.d(TAG, msg);
}
}