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

来源:互联网 发布:什么绘画软件好 编辑:程序博客网 时间:2024/05/17 03:19

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 blocke.printStackTrace();}    return bitmap;    }    @Override    protected void onPostExecute(Bitmap result) {    // TODO Auto-generated method stub    super.onPostExecute(result);    progressBar.setVisibility(View.GONE);    imageView.setImageBitmap(result);        }    }}

0 0