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); } } }