您的位置:首页 > 移动开发 > Android开发

【Android基础知识】AsyncTask基本使用

2016-07-12 11:01 423 查看

AsyncTask
任务

什么是线程的阻塞?


一个功能正在进行网络访问(耗时操作),另一个功能要实现打印功能,这样就会造成阻塞。如果阻塞超过5秒则会ANR错误。

什么是异步操作?

继承 AsyncTask<Void,Void,Void>类
实现 doInBackground(Void ... Arg0){执行的操作}方法就可以启动另一个线程,这个线程和主线程不在同一个线程中,不会造成阻塞。

AsyncTask的基本使用方法


生成该类的对象,并调用execute方法之后,首先执行的是onPreExecute方法,然后执行doInBackground()方法,最后执行onPostExecute()方法
例子,去网络下载一张图片,模拟耗时操作:
/**
* 异步任务 AsyncTask
* AsyncTask<Params,Progress,Result>是一个抽象类,通常
* 用于被继承,继承AsyncTask需要指定如下三个泛型参数:
* Params: 启动任务时输入的参数
* Progress:启动任务执行中返回进度值的类型。
* Result:后台执行任务完成后返回结果的类型
*
* doInBackground :必须重写,异步执行后台线程将要完成的任务。
* onPreExecute:执行后台耗时操作前被调用,通常完成一些初始化操作。
* onPostExecute:当 doInBackground 完成后,系统会自动调用
* onPostExecute()方法,并将doInBackground方法的返回的值传给该方法。
* onProgressUpdate 在doInBackground方法中调用publishProgress方法
* 更新任务的执行进度后,就会触发该方法。
*/
public class MainActivity extends Activity {
private ImageView imageView;
private ProgressBar progressBar;
MyAsyncTasks tasks;
private static final String URL="https://www.baidu.com/img/bd_logo1.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView)findViewById(R.id.imageView1);
progressBar = (ProgressBar)findViewById(R.id.progressBar1);
// MyAsyncTask task = new MyAsyncTask();
// task.execute();
tasks = new MyAsyncTasks();
tasks.execute(URL);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if(tasks != null &&
tasks.getStatus() == AsyncTask.Status.RUNNING){
//cancel 方法只是将对应的AsycnTask标记为cancel状态,并不是真正的停止
tasks.cancel(true);
}
}
class MyAsyncTasks extends AsyncTask<String, Void, Bitmap>{

@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected Bitmap doInBackground(String... params) {
// TODO Auto-generated method stub
String urlString = params[0];
Bitmap bitmap = null;
URLConnection connection;
InputStream is;
if(isCancelled()){
//cancel状态则直接结束
return null;
}
try{
connection = new URL(urlString).openConnection();
is = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bitmap = BitmapFactory.decodeStream(bis);
is.close();
bis.close();
Thread.sleep(3000);
}catch(IOException e){
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
progressBar.setVisibility(View.GONE);
imageView.setImageBitmap(result);

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息