Android中AsyncTask的讲解(动态下…

来源:互联网 发布:淘宝 英语教练 编辑:程序博客网 时间:2024/06/06 19:31
Android中AsyncTask的讲解(动态下载网络数据)Android中AsyncTask的讲解(动态下载网络数据)
TopServer         接口
UrlString           接口的注解
MyAsyncTask   异步代码
Tools                接口实现类
几个注意的点:
1:注解的注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
2:动态接口的实现Tools中的getInstance方法:
Object o = Proxy.newProxyInstance(type.getClassLoader(),new Class[]{type}, newMyHandler())

MyAsyncTask代码:
packagecom.jasen.async;
import android.os.AsyncTask;
import com.google.gson.Gson;
importjava.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
importjava.net.HttpURLConnection;
import java.net.URL;


public class MyAsyncTask<<spanstyle="color:#507874;">T> extends AsyncTaskT>,Void,Object> {
private String url;
private Class<<spanstyle="color:#507874;">T> t;
private CallBack<<spanstyle="color:#507874;">T> callBack;
public MyAsyncTask(String url,Class<<spanstyle="color:#507874;">T> t){
this.url = url;
this.t= t;
}
@Override
protected Object doInBackground(CallBack<<spanstyle="color:#507874;">T>... callBacks) {
callBack =callBacks[0];
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("GET");
connection.setDoInput(true);
int code =connection.getResponseCode();
if (code == 200) {
InputStream is = connection.getInputStream();
ByteArrayOutputStream bos =newByteArrayOutputStream();
int length = -1;
byte[] buffer = new byte[1024];
while ((length = is.read(buffer)) !=-1) {
bos.write(buffer, 0,length);
}
Gson gson = new Gson();
return gson.fromJson(bos.toString("utf-8"), t);
}else{
return newException("ResponseCode" +code);
}
} catch (IOException e) {
return e;
}
}


@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
if(t.isInstance(o)){
callBack.onSuccess((T)o);
}else{
callBack.onFail((Exception)o);
}
}

public interfaceCallBack<<span style="color:#507874;">S>{
void onSuccess(S text);
void onFail(Exception e);
}
}

Tools代码:
packagecom.jasen.async;

importjava.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
importjava.lang.reflect.ParameterizedType;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
import java.util.Locale;



publicclass Tools {
public static<<spanstyle="color:#507874;">T> T getInstance(Class<<spanstyle="color:#507874;">T> type){
Object o = Proxy.newProxyInstance(type.getClassLoader(),new Class[]{type}, newMyHandler());
return (T)o;
}
public static class MyHandlerimplementsInvocationHandler{
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
UrlString annotation =method.getAnnotation(UrlString.class);
if(annotation != null){
String url = String.format(Locale.CHINA,annotation.value(),objects);
Class
0 0
原创粉丝点击