"奇葩家园“之 asyncTask 与 url 下载篇
asyncTask 是android提供的一个轻量级的异步处理的类,有3个泛型参数,params,progress,result
params: 启动任务执行的时候传入的参数比如请求的 url 地址
progress:后台任务执行的百分比
result:后台任务执行完毕后返回的结果 比如string
使用asynctask必须要重写2个方法,一个是 doInBackground(Params...) 后台执行的方法,比较耗时的方法,这里不能直接操作ui,可以通过publicProgress(Progress...)来更新任务的进度
第2个方法是 onPostExecute(Result)相当于handler的处理ui的方式,此方式是任务执行完毕后获取返回的结果,进行下一步的处理。
还有 比如onPreExecute () 任务执行之前的方法,onCancelled() 用户调用取消时,要做的操作,onProgressUpdate(Progress...)可以使用进度条增加用户的体验度,此方法在主线程上执行,可以操作UI
注意事项:
task的实例必须在UI Thread中创建
execute方法必须在ui thread中调用
不要手动去调用 onPreExecute()....等方法
task只能被执行一次,否则多次调用时出现异常
demo:
private void asyncTaskGetJson(String params) {
new AsyncTask<String, Float, String>() {
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
URL url;
StringBuilder sb = new StringBuilder();
try {
url = new URL(params[0]);
URLConnection connection = url.openConnection();
float size = connection.getContentLength();
InputStream is = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
publishProgress((float)sb.toString().length() / size );
}
br.close();
isr.close();
is.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sb.toString();
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "开始访问sina网", Toast.LENGTH_LONG).show();
Log.d("abc", "开始访问sina网");
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "错误请求"+result, Toast.LENGTH_LONG).show();
Log.d("abc", "访问完毕,内容"+result);
}
@Override
protected void onProgressUpdate(Float... values) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "请求"+values[0], Toast.LENGTH_LONG).show();
}
}.execute(params);
}
调用:
asyncTaskGetJson("http://www.sina.com");