美文网首页
AsyncTask的使用

AsyncTask的使用

作者: simit | 来源:发表于2018-10-14 20:54 被阅读0次

    AsyncTask是一种轻量级的异步任务类,是在线程池中执行后台任务,然后把任务的结果和任务执行的进度传递给主线程进行UI的更新。
    AsyncTask的使用:

    public class AsyncTaskTest extends AsyncTask<String,Integer,Bitmap> {
    
        private static final String TAG = "AsyncTaskTest";
        private ImageView imageView;
        private ProgressBar pb;
        public AsyncTaskTest(ImageView imageView, ProgressBar pb) {
            this.imageView = imageView;
            this.pb = pb;
        }
         //主线程中执行,异步任务执行之前调用
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
        //主线程中执行,异步任务执行之后,返回值为异步任务的结果
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            pb.setVisibility(View.GONE);
            imageView.setImageBitmap(bitmap);
        }
        //主线程中执行,异步任务执行的进度发生改变的时候调用
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            //更新进度条
            Log.i(TAG,"onProgressUpdate  "+values[0]);
            pb.setProgress(values[0]);
        }
        //线程池中执行,用于执行异步任务,参数表示异步任务的请求参数,此方法中可调用                
        //publishProgress 更新进度,publishProgress 会调用onProgressUpdate
        @Override
        protected Bitmap doInBackground(String... strings) {
    
            for (int i = 0; i < 100; i++) {
                try {
                    Thread.sleep(100);
                    publishProgress(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            try {
                URLConnection URLConnection = new URL(strings[0]).openConnection();
                InputStream inputStream = URLConnection.getInputStream();
                BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
                Bitmap bitmap = BitmapFactory.decodeStream(bufferedInputStream);
                inputStream.close();
                bufferedInputStream.close();
                return bitmap;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }   
    

    然后在主线程中实例AsyncTask并调用execute方法即可。
    使用AsyncTask的注意事项:
    1.AsyncTask的对象必须在主线程中创建并在主线程中调用execute方法。
    2.不能手动调用onPreExcute,onPostExecute,doInBackground和onProgressUpdate方法。
    3.AsyncTask的任务只能执行一次,否则会报运行时异常。
    AsyncTask中有两个线程池,SerialExecutor 和 THREAD_POOL_EXECUTOR 还有一个Handler——InternalHandler,其中线程池SerialExecutor 用于任务的排队,而线程池THREAD_POOL_EX
    ECUTOR 负责真正的执行任务,InternalHandler负责将执行环境从线程池切换到主线程。

    相关文章

      网友评论

          本文标题:AsyncTask的使用

          本文链接:https://www.haomeiwen.com/subject/bknoaftx.html