前一段时间面试的时候竟然有人问这个东西,说实话这东西一般应该很少用到了吧,当然问到这东西我只能说一脸懵逼,只是依稀记得有这么个东西,自定义类并且继承继承。当然之所以使用异步那就是因为UI线程不能进行耗时操作。子线程又不可以进行UI操作,这个异步是用来加载网络数据的很少用到。网络框架那么多。。。。。。。写一下简单用法吧
第一步自定义类继承AsyncTask
并指明三大泛型的数据类型
1、AsyncTask<Params, Progress, Result>三大泛型说明:
Params:请求的网址,String/URL
Progress:进度的数据类型,Integer/Void
Result:结果的数据类型,String/byte[]/BitMap/ArrayList<E>/具体的类型
第二步
1、重写必须的方法
doInBackground:开启子线程请求网络数据,在这个方法内部不能操作UI控件
onPostExecute:更新UI控件
2、重写非必须方法
onPreExecute():执行子线程之前调用,常常用于进度对话框或进度条的显示
onProgressUpdate(Progress... values) :更新进度
先写一个Http的后面再写一个OKhttp的
public class MyAsyncTask extends AsyncTask<String, Void, String> {
private Context context;
private getResult mGetResult;
//初始化
public MyAsyncTask(Context context, TextView tv, getResult getResult) {
// TODO Auto-generated constructor stub
this.context = context;
mGetResult = getResult;
}
//开启子线程执行网络请求
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
//HTTP协议
HttpURLConnection huc = null;
InputStream is = null;
try {
//1、创建URL对象
URL url = new URL(params[0]);
//2、创建HttpURLConnection对象
huc = (HttpURLConnection) url.openConnection();
//3、设置请求信息
huc.setConnectTimeout(3000);
//4、连接
huc.connect();
//5、验证状态响应码
if (huc.getResponseCode() == 200) {
//6、获取响应数据
is = huc.getInputStream();
int len;
byte[] data = new byte[1024];
StringBuilder builder = new StringBuilder();
while ((len = is.read(data)) != -1) {
builder.append(new String(data, 0, len));
}
return builder.toString();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//7、关闭
if (is != null) {
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (huc != null) {
huc.disconnect();
}
}
return null;
}
//更新UI控件的内容
@Override
protected void onPostExecute(String result) {
if (result != null) {
mGetResult.getResults(result);//数据回调
} else {
Toast.makeText(context, "当前无网络,请稍后再试", Toast.LENGTH_LONG).show();
}
}
public interface getResult {
void getResults(String s);
}
}
activity中使用方法
/*Activity使用异步任务的步骤:
* 1、创建异步任务对象
* 2、执行*/
//创建异步任务对象
MyAsyncTask asyncTask = new MyAsyncTask(this, tv, new MyAsyncTask.getResult() {
@Override
public void getResults(String s) {
tv.setText(s);//拿到回调回来的数据
}
});
//执行异步任务 后面是链接
asyncTask.execute("http://litchiapi.jstv.com/api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=511D3BE5301280E0992C73A9DEC41");
上边是一个很简单的异步的使用,并且使用了接口回调的方式将数据带回。
public class NewsAsyncTask extends AsyncTask<String, Integer, ArrayList<FeedsBean>> {
// 2、声明属性并通过构造方法完成属性的实例化
private Context context;
private ArrayList<FeedsBean> listData;
private ProgressDialog pd;// 声明进度对话框对象
public NewsAsyncTask(Context c) {
// TODO Auto-generated constructor stub
context = c;
listData = new ArrayList<>();
}
// 3、重写方法
// 开启子线程并请求网络
// 开启子线程之前执行
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
//实例化对象
pd = new ProgressDialog(context);
pd.setTitle("加载提醒");//设置标题
pd.setIcon(R.mipmap.ic_launcher);//设置对话框的图标
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);//设置对话框的样式
pd.setMessage("请稍等,数据正在加载中……");//设置提示信息
pd.show();//显示对话框
}
@Override
protected ArrayList<FeedsBean> doInBackground(String... params) {
// TODO Auto-generated method stub
try {
OkHttpClient okHttpClient = new OkHttpClient();//创建OkHttpClient对象
Request request = new Request.Builder()
.url(params[0])//接口地址
.build();//创建request
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
Gson gson = new Gson();
MyTest bew = new Gson().fromJson(response.body().string(), MyTest.class);
listData.addAll( bew.getParamz().getFeeds());
return listData;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(ArrayList<FeedsBean> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if (result != null) {
Log.e("=======>>>", result.size() + "");//返回数据结果
} else {
Toast.makeText(context, "网络异常,请稍后再试", Toast.LENGTH_LONG).show();
}
pd.dismiss();//取消对话框的显示
}
}
这个是添加了一个对话框的。简单的使用就这些吧