AsyncTask的简单使用

Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。  
关于AsuncTask的几种方法:
一个异步任务的执行一般包括以下几个步骤:
1.  执行(Params ... params) ,执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。

2.  onPreExecute() ,在execute(Params ... params)被调用后立即执行,一般用来执行后台任务前对UI做一些标记。

3.  doInBackground(参数... PARAMS)  ,在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(进展..值)来更新进度信息。

4. onProgressUpdate(Progress... values) ,在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。

5. onPostExecute(Result result) ,当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
//下面是代码 简单操作
 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AsyncTask<Void,Void,Bitmap> asyncTask=new AsyncTask<Void, Void, Bitmap>() {
                    //添加在开始之前的准备工作
                    @Override
                    protected void onPreExecute() {
                        //在加载图片之前  进行ProgressBar的设置
                        //图片加载完成之前ProgressBar可见
                        pb.setVisibility(View.VISIBLE);
                        super.onPreExecute();
                    }
                    //相当于子线程  在子线程中获取数据
                    @Override
                    protected Bitmap doInBackground(Void... params) {
                        try {
                            URL url=new URL("http://p2.so.qhimgs1.com/sdr/539_768_/t01dd2d9905a6f3ec9e.jpg");
                            HttpURLConnection connection=(HttpURLConnection)url.openConnection();
                            //设置请求方式
                            connection.setRequestMethod("GET");
                            connection.setConnectTimeout(1024*8);
                            connection.setReadTimeout(1024*8);
                            int responseCode = connection.getResponseCode();
                            if (responseCode==200){
                                InputStream is=connection.getInputStream();
                                //获取图片的方法
                                Bitmap bitmap = BitmapFactory.decodeStream(is);
                                return  bitmap;
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        return null;
                    }
                     //相当于主线程  进行UI更新操作
                    @Override
                    protected void onPostExecute(Bitmap bitmap) {
                        image.setImageBitmap(bitmap);
                        //图片加载完成后 隐藏ProgressBar
                        pb.setVisibility(View.GONE);
                        super.onPostExecute(bitmap);
                    }
                };
                asyncTask.execute();//设置串行下载(一个下载完了才会下载下一个   不会同时下载多个)
                //asyncTask.executeOnExecutor();并行下载   可以多个任务一起下载   (不好)
            }
        });
    }
}
今天大概又系统的总结了下AsyncTask,

public class MainActivity extends AppCompatActivity {

    private ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
           new MyAsyncTask().execute("");//这里的参数就是要请求的网址

    }
   
   
   
// 第一个泛型就是 doInBackground 方法的参数类型, 也就是execute传入的参数类型
    // 第二个泛型是 publishProgress(在doInBackground 里调用) 方法的参数类型, 也是onProgressUpdate方法的参数类型
    // 第二个泛型是 doInBackground 的返回值类型, 也是 onPostExecute 的参数类型
private class MyAsyncTask extends AsyncTask<String,Integer,String>{ //一 @Override//运行在主线程,执行在doInBackground之前 也就是在子线程之前运行(只要运行在网络求情之前的操作都可以写在这里面) protected void onPreExecute() { //进度条 /进度条初始化/ super.onPreExecute(); } //二 @Override//这里相当于子线程 可以获取网络数据 通过params[0]得到网址 protected String doInBackground(String... params) { String name = Thread.currentThread().getName(); Log.d("PY","doInBackground接受的参数"+params[0]+"所在线程"+name); //这里做网络请求的操作 //发布进度条///加载进度条/ for (int i = 0; i <10 ; i++) { publishProgress(i);//调用这个方法实际运行的方法是onProgressUpdate这个方法 } return null; //这里返回 下面的onPostExecute接受 相当于异步请求 } @Override//在这里更新设置进度条 protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } @Override//这里相当于在主线程 运行在doInBackground之后 protected void onPostExecute(String s) {// S相当于doInBackground返回的数据 //拿到处理后的数据 进行UI更新 //结束进度条 super.onPostExecute(s); } } }

 这相当于一个AsyncTask的大体框架,里面可以根据注释放入一些代码,来实现一些功能;


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值