Android异步任务之AsyncTask的使用
16lz
2021-01-23
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("下载完成");} }}下面是程序运行截图:
更多相关文章
- Android中View转换为Bitmap及getDrawingCache=null的解决方法
- Handler解析(一):是如何实现线程之间的切换
- android 启动线程注意的问题
- android中获取context的多种方法的区别(this,getbascontext(),get
- Android获取窗体信息的Util方法
- android http通过post上传文件和提交参数(通过拼装协议)
- Android 几种加密解密的方法(仅代码)
- EACCES (permission denied)解决办法 android 文件读写