Android异步任务之AsyncTask的使用

来源:互联网 发布:相貌评分软件结果 编辑:程序博客网 时间:2024/04/27 07:14

AsyncTask是Android中用来处理异步任务的类,通过继承AsyncTask类并复写其中的方法,我们可以很容易的实现异步任务,比如网络操作,文件读写操作等

由于Android的UI线程中不能处理耗时太长的任务(一般耗时超过5秒的任务在UI线程中执行,就会导致ANR,即应用程序没有响应),AsyncTask为我们提供了方便的操作异步任务的方法,我们主要实现AsyncTask中的如下几个方法,就能完成异步任务的执行,在合适的时间更新UI

1、onPreExecute()

2、doInBackground()

3、onProgressUpdate()

4、onPostExecute()

其中第二个方法是在后台执行的,其余三个方法都是在UI线程中完成的

下面上代码:

package com.example.testbitmap;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private TextView tv;private ProgressBar pb;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                tv = (TextView) findViewById(R.id.textview);        tv.setText("未下载");        pb = (ProgressBar) findViewById(R.id.progressbar);    }        //按钮的点击事件,点击后开始下载文件    public void btnClick(View view){    //下载文件的URL地址    String url = "http://nb.baidupcs.com/file/478ac869d675f83496786f4b817f94a2?fid=659961273-250528-991835723656149&time=1411713894&sign=FDTAXER-DCb740ccc5511e5e8fedcff06b081203-u1bc1uYwyuKSX1ao4fl%2Fi5vokpI%3D&to=nbb&fm=Nin,B,T,t&newver=1&newfm=1&flow_ver=3&expires=8h&rt=sh&r=246606095&mlogid=1566043457&vuk=1812575994&vbdid=3834557252&fn=whty_zhongshang_0923_2.apk";    //开启异步任务    new DownloadTask().execute(url);    }        /**     * 继承自AsyncTask的类,用于异步任务的执行     * @author yubo<br/>     * 2014年9月26日     */    class DownloadTask extends AsyncTask<String, Integer, File>{        @Override    protected void onPreExecute() {//在UI线程中执行    super.onPreExecute();    //开始下载前    tv.setText("开始下载");    pb.setMax(100);    Toast.makeText(MainActivity.this, "start download...", Toast.LENGTH_SHORT).show();    }@Overrideprotected File doInBackground(String... params) {//在后台线程中执行//下载中int contentLen = 0;//文件总大小int hasDownload = 0;try {URL url = new URL(params[0]);URLConnection conn = url.openConnection();//获取文件的总长度contentLen = conn.getContentLength();InputStream is = conn.getInputStream();int hasRead = 0;//新建保存下载的文件File f = new File("mnt/sdcard/test.apk");FileOutputStream fos = new FileOutputStream(f);byte[] buf = new byte[100];while((hasRead = is.read(buf)) > 0){fos.write(buf, 0, hasRead);hasDownload += hasRead;//计算下载进度并发送进度publishProgress((int)((hasDownload * 1.0 / contentLen) * 100));}fos.close();is.close();return f;} catch (Exception e) {e.printStackTrace();}return null;}@Overrideprotected void onProgressUpdate(Integer... values) {//在UI线程中执行super.onProgressUpdate(values);//设置进度条的进度pb.setProgress(values[0]);//设置文本显示下载进度tv.setText(values[0] + "%已下载");}@Overrideprotected void onPostExecute(File result) {//在UI线程中执行super.onPostExecute(result);//下载完成后pb.setProgress(0);pb.setVisibility(View.GONE);tv.setText("下载完成");}    }}
下面是程序运行截图:

0 0