Skip to content

Commit

Permalink
add loading support
Browse files Browse the repository at this point in the history
  • Loading branch information
jinjinyun committed Oct 19, 2014
1 parent f48db49 commit 4a9fc49
Show file tree
Hide file tree
Showing 8 changed files with 312 additions and 64 deletions.
7 changes: 0 additions & 7 deletions doc/index.html

This file was deleted.

15 changes: 15 additions & 0 deletions src/org/xidea/android/Callback.java
@@ -1,12 +1,27 @@
package org.xidea.android;

import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 通用回掉接口
* @author jindawei
*
* @param <ResultType>
*/
public interface Callback<ResultType> {

/**
* 用于Http请求时,放在callback方法上,可以自动显示和隐藏加载对话框。
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Loading {
String value() default "数据加载中...";
}
/**
* 在调用时所在的线程执行回调处理(比如事件发起的调用是在ui线程,回调就可以直接操作ui元素)
* @param result 经过自动数据转换后的对象, 如,我们要求一个JavaBean,他会自动构造该对象, 并且递归初始化他的属性(从json属性值自动转换类型并赋值),支持范型
Expand Down
1 change: 1 addition & 0 deletions src/org/xidea/android/impl/AsynTask.java
Expand Up @@ -11,6 +11,7 @@
import org.xidea.android.Callback.CacheCallback;
import org.xidea.android.Callback.Cancelable;
import org.xidea.android.impl.Network.CachePolicy;
import org.xidea.android.impl.http.LoadingImpl;

public interface AsynTask extends Cancelable {
void onStart();
Expand Down
25 changes: 21 additions & 4 deletions src/org/xidea/android/impl/http/HttpAsynTaskImpl.java
Expand Up @@ -4,19 +4,22 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.net.URL;
import java.util.Map;

import org.xidea.android.Callback;
import org.xidea.android.Callback.CacheCallback;
import org.xidea.android.Callback.Loading;
import org.xidea.android.Callback.PrepareCallback;
import org.xidea.android.impl.AsynTask;
import org.xidea.android.impl.DebugLog;
import org.xidea.android.impl.Network.CachePolicy;
import org.xidea.android.impl.Network.HttpMethod;
import org.xidea.android.impl.io.IOUtil;
import org.xidea.android.impl.ui.ImageUtil;
import org.xidea.el.impl.ReflectUtil;

import android.graphics.Bitmap;
import android.graphics.Movie;
Expand All @@ -36,7 +39,8 @@ class HttpAsynTaskImpl implements AsynTask {
private final HttpMethod method;
private final HttpSupport http;
private final Handler from = HttpUtil.currentHandler();
private final Type[] types;// [prepareType?,callbackType]
private final Type prepareType;
private final Type callbackType;

private Thread thread;// for interrupt
private boolean canceled;
Expand All @@ -49,12 +53,23 @@ public HttpAsynTaskImpl(HttpSupport http, String path, HttpMethod method,
this.url = HttpUtil.parseURL(path);
this.method = method;
this.callback = callback;
this.types = HttpUtil.getResultType(callback);
Type[] types = HttpUtil.getPrepareCallbackType(callback);//[prepareType?,callbackType]
prepareType = types[0];
callbackType = types[1];

this.postParams = postParams;
}

@Override
public void onStart() {
Method method;
try {
method = callback.getClass().getDeclaredMethod("callback", ReflectUtil.baseClass(callbackType));
Loading loading = method.getAnnotation(Loading.class);
LoadingImpl.showDialog(this,loading);
} catch (NoSuchMethodException e) {
DebugLog.error(e);
}
startedTime = System.currentTimeMillis();
thread = Thread.currentThread();
http.getStatistics().onHttpWaitDuration(url,
Expand All @@ -63,7 +78,7 @@ public void onStart() {

@Override
public Object load(CachePolicy cp) {
Type rawType = types[0];
Type rawType = prepareType == null?callbackType:prepareType;
Object result = null;
try {
if (rawType == AsynTask.class) {
Expand Down Expand Up @@ -122,7 +137,7 @@ public boolean doExecute(Object result, final boolean cacheCheck) {
result = ((PrepareCallback) callback).prepare(result);
if (result != null) {// 只有prepare
// 结果有可能变化,因为在loadRaw中已经正确转型了。
result = HttpUtil.transform(result, types[1]);
result = HttpUtil.transform(result, callbackType);
}
}
final Object result2 = result;
Expand Down Expand Up @@ -190,6 +205,7 @@ private void postBack(Runnable runner) {

@Override
public void onComplete() {
LoadingImpl.cancleUI(this);
}

@Override
Expand All @@ -215,6 +231,7 @@ public int getTimeout() {

@Override
public void cancel() {
LoadingImpl.cancleUI(this);
if (!canceled) {
canceled = true;
}
Expand Down
2 changes: 2 additions & 0 deletions src/org/xidea/android/impl/http/HttpRequestImpl.java
Expand Up @@ -72,6 +72,8 @@ private URLConnection doInit(URL url, Map<String, String> requestHeaders,
url = HttpUtil.appendCookieAsQuery(url, cookie);
}
URLConnection conn = proxy == null ? url.openConnection() : url.openConnection(proxy);

HttpUtil.trustConnection(conn);
HttpUtil.assertNotCanceled(conn, cancelState);
conn.setConnectTimeout(CONNECT_TIMEOUT);
conn.setReadTimeout(READ_TIMEOUT);
Expand Down

0 comments on commit 4a9fc49

Please sign in to comment.