1 . AsyncTask实现的原理,和适用的优缺点
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
使用的优点: 简单,快捷,过程可控 。
使用的缺点:在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.
2.创建异步类:
public class NetWorkAsyncTask<T> extends AsyncTask<NetWorkCallback<T>,Void,Object> {
private String url;
private NetWorkCallback<T> callback;
private Class<T> clazz;
public NetWorkAsyncTask(String url, Class<T> clazz) {
this.url = url;
this.clazz = clazz;
}
@Override
protected Object doInBackground(NetWorkCallback<T>... params) {//params代表的是excute()方法传入的参数
callback = params[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();
int length;
byte[] buffer = new byte[102400];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((length = is.read(buffer)) != -1){
bos.write(buffer,0,length);
}
Gson gson = new Gson();//通过Gson来解析网络获取的数据
return gson.fromJson(bos.toString(),clazz);
}else {
return new RuntimeException("response"+ code);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
/*
*isInstance()方法介绍
* http://www.360doc.com/content/12/0528/16/10042054_214284612.shtml
*
* */
if (clazz.isInstance(o)) {
callback.onSuccess((T) o);
}else if (o instanceof Exception){
callback.onFail((Exception) o);
}
}
}
3.创建回调接口
public interface NetWorkCallback<T> {
void onSuccess(T text);
void onFail(Exception e);
}
4.创建主线程:
public class MainActivity extends AppCompatActivity implements NetWorkCallback<Entry>{
private TextView text;
private WebView web;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.main_text);
web = (WebView) findViewById(R.id.main_web);
TopServer topServer = Tools.getInstance(TopServer.class);
topServer.getId(13122).execute(this);
}
@Override
public void onSuccess(Entry entry) {
text.setText(entry.getFromName());
web.loadDataWithBaseURL("http://www.tngou.net",entry.getMessage(),"text/html; charset=utf-8", "UTF-8", null);
}
@Override
public void onFail(Exception e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "网络异常", Toast.LENGTH_SHORT).show();
}
}
5.创建TopServer接口
public interface TopServer {
@UrlStr("http://www.tngou.net/api/top/show?id=%d")//给该方法添加注解
NetWorkAsyncTask<Entry> getId(int id);
}
6.创建注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UrlString {
String value();
}
7.创建代理类:
public class Tools {
public static<T> T getInstance(Class<T> type){
Object o = Proxy.newProxyInstance(type.getClassLoader(), new Class[]{type}, new Handler());
return (T) o;
}
private static class Handler implements InvocationHandler{//Handler通过实现该接口来创建代理类,通过实例化来创建代理类对象
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
UrlStr annotation = method.getAnnotation(UrlStr.class);
if (annotation != null){
String url = String.format(Locale.CHINA, annotation.value(), args);
Class<?> returnType = method.getReturnType();//获取该方法的对象的返回类型
if (returnType.equals(NetWorkAsyncTask.class)) {
ParameterizedType parameterizedType = (ParameterizedType) method.getGenericReturnType();//获取泛型的返回类型
Type types = parameterizedType.getActualTypeArguments()[0];
return new NetWorkAsyncTask<>(url, ((Class) types));
}
}
return null;
}
}
}
8.创建实体来解析网络上获取的Json数据
public class Entry {
@SerializedName("fromname")
private String fromName;
@SerializedName("message")
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getFromName() {
return fromName;
}
public void setFromName(String fromName) {
this.fromName = fromName;
}
}
9.关于Proxy代理服务的参考资料:http://my.oschina.net/huangyong/blog/159788#comment-list