在 网络 的获取数据的过程中,多线程,异步 是很常见的方法,在这儿,我介绍一些处理办法
1,Thread
Thread的使用,一般结合 Handler的使用,
所以的操作,耗时操作,放在Thread里面进行,
2,AsyncTask
AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String.
doInBackground:必须重写,异步执行后台线程要完成的任务,耗时操作将在此方法中完成.
onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化操作.
onPostExecute:当doInBackground方法完成后,系统将自动调用此方
法,并将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新.
onProgressUpdate:当在doInBackground方法中调用publishProgress方法更新任务执行进度后,将调用此方法
.通过此方法我们可以知晓任务的完成进度.
这儿不做多介绍,AsyncTask的简单使用,我的其他博客有具体的介绍;
自定义的AsyncTask
public abstract class MyHttpAsyncTask<Params, Result>
extends AsyncTask<Params, Void, Result> {
Context context;
/**
* 传递上下文的使用。
* @param context
*/
public MyHttpAsyncTask(Context context) {
this.context = context;
}
public final AsyncTask<Params, Void, Result> executeProxy(
Params... params) {
return null;
}
}
NODO:
1,一定要传递上下文(Context)进来。
2,根据自己的需求,进行泛型操作。
3,下面的完整版,要使用final修饰。类似与Thread.start方法 由于final修饰,无法Override,方法重命名 省略掉网络判断
public abstract class MyHttpAsyncTask<Params, Result>
extends AsyncTask<Params, Void, Result> {
Context context;
/**
* 传递上下文的使用。
* @param context
*/
public MyHttpAsyncTask(Context context) {
this.context = context;
}
public final AsyncTask<Params, Void, Result> executeProxy(
Params... params) {
if (NetUtil.checkNetWork(context)) {
return super.execute(params);
} else {
PromptManager.showNoNetWork(context);
}
return null;
}
}
使用,
new MyHttpAsyncTask<String,List<NewInfo>>(this){
@Override
protected List<NewInfo> doInBackground(String... params) {
newInfoList = newsNet.getNewsFromInternet();
return newInfoList;
}
@Override
protected void onPostExecute(List<NewInfo> newInfos) {
list_news_item = newInfos;
LogUtils.Logi("AnyscTask","xxxxx ok ok ok");
news_xiyan.setAdapter(new NewsListAdapter());
super.onPostExecute(newInfos);
}
}.executeProxy("");