AsyncTask 总结

来源:互联网 发布:戴尔外星人灯光软件 编辑:程序博客网 时间:2024/06/11 18:36

AsyncTask 是android 提供给开发者一种简单异步机制。不用去使用Handle 而能简单的实现 异步任务。
相关链接:
官网API
参考博客:
详解Android中AsyncTask的使用
Android AsyncTask完全解析,带你从源码的角度彻底理解
原型:

public abstract class AsyncTask<Params, Progress, Result> 

简单使用AsyncTask 下载一张图片

public class MainActivity extends AppCompatActivity {    private static final String TAG = "ASYNC_TASK";    ImageView image;    ProgressBar mProgress;    TextView tvw;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        image = (ImageView) findViewById(R.id.image);        mProgress = (ProgressBar) findViewById(R.id.progress);        tvw = (TextView) findViewById(R.id.text);        //注意每次需new一个实例,新建的任务只能执行一次,否则会出现异常        DownloadImageTask downloadImageTask = new DownloadImageTask();        //请求的url 的地址        String url = "http://imgsrc.baidu.com/forum/w%3D580/sign=ea1cfd23e0cd7b89e96c3a8b3f254291/05950a7b02087bf434caaa00f4d3572c11dfcf31.jpg";        //执行下载图片的请求        downloadImageTask.execute(url);    }    //重写AsyncTask 来实现请求    private class DownloadImageTask extends AsyncTask<String, Integer, byte[]> {        @Override        protected byte[] doInBackground(String... params) {            Log.i(TAG, "doInBackground(Params... params) called");            try {                //请求的HttpClient                HttpClient client = new DefaultHttpClient();                //get请求                HttpGet get = new HttpGet(params[0]);                //返回值                HttpResponse response = client.execute(get);                if (response.getStatusLine().getStatusCode()                        == HttpStatus.SC_OK){                    //干活的实体                    HttpEntity entity = response.getEntity();                    InputStream inputstream = entity.getContent();                    long total = entity.getContentLength();                    ByteArrayOutputStream baos = new ByteArrayOutputStream();                    byte[] buf  = new byte[1024];                    int count = 0;                    int length = -1;                    //数据读取                    while ((length = inputstream.read(buf))!=-1){                        baos.write(buf,0,length);                        count+=length;                        //通知进度条更新                        publishProgress((int) ((count / (float) total) * 100));                        try {                            Thread.sleep(100);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                    return baos.toByteArray();                }            } catch (IOException e) {                e.printStackTrace();            }            return null;        }        //数据准备和初始化        @Override        protected void onPreExecute() {            Log.i(TAG, "onPreExecute() called");            tvw.setText("loading");            super.onPreExecute();        }        //成功之后获得的数据        @Override        protected void onPostExecute(byte[] bytes) {            super.onPostExecute(bytes);            Log.i(TAG, "onPostExecute(Result result) called");            tvw.setText("loading is finish");            image.setImageBitmap(Bytes2Bitmap(bytes));            mProgress.setVisibility(View.INVISIBLE);        }        //进度条更新        @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);            Log.i(TAG, values[0]+"");            mProgress.setProgress(values[0]);            tvw.setText("loading..." + values[0] + "%");        }    }    //byte  2 bitmap    public Bitmap Bytes2Bitmap(byte[] b) {        if (b.length != 0) {            return BitmapFactory.decodeByteArray(b, 0, b.length);        } else {            return null;        }    }}

这里写图片描述

AsyncTask 源码解析

Android AsyncTask完全解析,带你从源码的角度彻底理解
详解Android中AsyncTask的使用

0 0