AsyncTask学习笔记

除了使用Handler去更新UI组件,还可以使用异步任务AsyncTask,也是一个好用的方法

AsyncTask是一个抽象类,通常用于被继承,如:

class DownloadTask extends AsyncTask<Params,Progress,Result>

三个参数的含义:

Progress:任务完成的进度值类型

Result: 任务完成后的返回值类型

AsyncTask需要实现的方法:

doInBackground()、onProgressUpdate()、onPreExecute()、onPostExecute()

doInBackground(Params...):会自己去开启一个后台新线程用于执行后台耗时操作,在此方法中可使用publishProgress()去更新任务进度,任务完成后会将该方法的返回值传给onPostExecute(Result result)

onProgressUpdate(Progress values): 更新任务的进度

onPreExecute():后台耗时任务操作执行前调用,用于任务执行的一些初始化工作,如界面的初始化

onPostExecute(): doInBackground()方法执行完后执行该方法,doInBackground()的返回值传给这个方法


用AsyncTask实现下载实例代码如下:

public class MainActivity extends Activity {
    private TextView show;
    private Button downloadBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = (TextView) findViewById(R.id.show);
        downloadBtn = (Button) findViewById(R.id.download);
        downloadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DownloadTask task = new DownloadTask(MainActivity.this);
                try {
                    task.execute(new URL("http://blog.youkuaiyun.com/csdn_blog_lcl/article/details/52739018"));
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    class DownloadTask extends AsyncTask<URL,Integer,String>{
        private Context contex;
        private int hasRead = 0;
        private ProgressDialog progressDialog;
        public DownloadTask(Context context){
            this.contex = context;
        }
        //  该方法开启后台新线程,用来执行耗时任务
        @Override
        protected String doInBackground(URL... params) {
            StringBuffer sb = new StringBuffer();
            try {
                URLConnection conn = params[0].openConnection();
                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                conn.connect();
                String line ="";
                while((line=br.readLine()) != null){
                    sb.append(line+"\n");
                    hasRead++;
                    publishProgress(hasRead); //更新任务进度,onProgressUpdate方法会被触发
                    Thread.sleep(100);
                }
                return sb.toString();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }
        //  执行耗时操作前调用,执行任务的准备工作,如初始化界面
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = new ProgressDialog(contex);
            progressDialog.setTitle("任务执行中");
            progressDialog.setMessage("任务正在执行,请稍等");
            progressDialog.setIndeterminate(false);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setMax(306);
            progressDialog.setCancelable(false);
            progressDialog.show();
        }
        //  doInBackground方法的返回值会传给onPostExecute
        @Override
        protected void onPostExecute(String s) {  //任务执行完后将返回值传给了这个方法
            super.onPostExecute(s);
            show.setText(s);    //  更新UI组件
            progressDialog.dismiss();
        }

        @Override
        protected void onProgressUpdate(Integer... values) {  //  更新进度
            super.onProgressUpdate(values);
            show.setText("已读取"+values[0]+"行");
            progressDialog.setProgress(values[0]);
        }
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值