原引自农民伯伯翻译的Android中文API
代码部分来自慕课网AsyncTask教程
AysncTask必须被继承使用。子类至少覆盖一个方法 (doInBackground(Params...)),最经常覆盖另一个(onPostExecute(Result).)
AsyncTask的泛型类型
这三个类型被用于一个异步任务,如下:
1. Params,启动任务执行的输入参数
2. Progress,后台任务执行的百分比
3. Result,后台计算的结果类型
在一个异步任务里,不是所有的类型总被用。假如一个类型不被使用,可以简单地使用 Void类型:private class MyTask extends AsyncTask<Void, Void, Void> { ... }
4个步骤
当一个异步任务被执行,任务经过四各步骤:
1.onPreExecute()
,在UI线程上调用任务后立即执行。这步通常被用于设置任务,例如在用户界面显示一个进度条。
2.doInBackground(Params...)
,后台线程执行onPreExecute()完后立即调用,这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步返回,将传回到上一步。在执行过程中可以调用publishProgress(Progress...)
来更新任务的进度。
3.onProgressUpdate(Progress...)
,一次呼叫publishProgress(Progress...)
后调用 UI线程。执行时间是不确定的。这个方法用于当后台计算还在进行时在用户界面显示进度。例如:这个方法可以被用于一个进度条动画或在文本域显示记录。
4.onPostExecute(Result)
,当后台计算结束时,调用 UI线程。后台计算结果作为一个参数传递到这步。
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
当一个异步任务被执行,任务经过四各步骤:
1.onPreExecute()
,在UI线程上调用任务后立即执行。这步通常被用于设置任务,例如在用户界面显示一个进度条。
2.doInBackground(Params...)
,后台线程执行onPreExecute()完后立即调用,这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步返回,将传回到上一步。在执行过程中可以调用publishProgress(Progress...)
来更新任务的进度。
3.onProgressUpdate(Progress...)
,一次呼叫publishProgress(Progress...)
后调用 UI线程。执行时间是不确定的。这个方法用于当后台计算还在进行时在用户界面显示进度。例如:这个方法可以被用于一个进度条动画或在文本域显示记录。
4.onPostExecute(Result)
,当后台计算结束时,调用 UI线程。后台计算结果作为一个参数传递到这步。
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_text);
mimageview=(ImageView) findViewById(R.id.img);
mprogressbar=(ProgressBar) findViewById(R.id.pro);
new MyAsyncTask().execute(URL);
}
class MyAsyncTask extends AsyncTask<String,Void,Bitmap>{
Bitmap bitmap=null;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
mprogressbar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
mprogressbar.setVisibility(View.GONE);
mimageview.setImageBitmap(bitmap);
}
@Override
protected Bitmap doInBackground(String... params) {
// TODO Auto-generated method stub
String url=params[0];
URLConnection connection;//网络连接对象
InputStream is;
try {
connection=new URL(url).openConnection();//获取对象
is=connection.getInputStream();
BufferedInputStream bis=new BufferedInputStream(is);
bitmap=BitmapFactory.decodeStream(bis);
is.close();
bis.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}