AsyncTask的用法
来源:互联网 发布:使用sci hub 知乎 编辑:程序博客网 时间:2024/06/11 03:50
android.os.AsyncTask<Params,Progress,Result>
为什么会有AsyncTask类
1、为了解决主线程中的耗时操作,防止主线程出现ANR。完整类名:android.os.AsyncTask<Params, Progress, Result>
是一个抽象类,通常被继承。
Params:任务执行时,所需要的参数
Progress:后台任务执行时返回的进度值
Result:后台任务执行完成后,返回的结果值
构建AsyncTask子类的回调方法
doInBackground:必须重写,异步执行后台线程将要完成的任务
onPreExecute:执行后台耗时操作前被调用,通常用户完成一些初始化操作
onPostExecute: 当doInBackground()完成后,系统会自动调用
onProgressUpdate: 在doInBackground()方法中调用publishProgress()方法中调用publishProgress
更新任务的执行进度后,就会触发该方法。
AsyncTask的执行顺序:
onPreExecute--->doInBackground(调用publishProgress方法后)--->onProgressUpdate--->onPostExecute
在主线程中创建AsyncTask<Params,Progress,Result>的子类,调用execute方法。
例子:通过AsyncTask异步加载网络图片
MainActivity.java
package lzl.edu.com.asynctaskdemo;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.ProgressBar;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class MainActivity extends Activity { private ImageView mImage; private Button mBtn_getImage; private ProgressBar mPb; public static final String IMAGE_URL = "http://img.firefoxchina.cn/2015/10/5/201510221522590.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImage = (ImageView)findViewById(R.id.myImage); mBtn_getImage = (Button)findViewById(R.id.btn_getImage); mPb = (ProgressBar)findViewById(R.id.pb); mBtn_getImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new getImageAsyncTask().execute(IMAGE_URL); } }); //定义一个一步操作的实现类,在非主线程中进行一些耗时的操作 } //定义一个异步任务,来完成网络图片的获取。并且显示加载图片的进度条。 class getImageAsyncTask extends AsyncTask<String,Void,Bitmap>{ //用户点击访问图片之后,显示进度条 @Override protected void onPreExecute() { super.onPreExecute(); mPb.setVisibility(View.VISIBLE); } @Override protected Bitmap doInBackground(String... params) { Bitmap bitmap = null; try { //模拟耗时工作 Thread.sleep(5000); //将String类型的地址,转换成URL路径 Log.i("comde",params[0]); URL url = new URL(params[0]); HttpURLConnection connection =(HttpURLConnection)url.openConnection(); //设置超时时间 connection.setReadTimeout(5000); Log.i("comde",""+connection.getResponseCode()); //如果访问码==200表示访问成功 if(connection.getResponseCode() == 200){ InputStream is = connection.getInputStream(); //将获取的输入流,转换成Bitmap对象 bitmap = BitmapFactory.decodeStream(is); } }catch (Exception e){ e.printStackTrace(); } return bitmap; } //返回结果是图片,并让进度条消失 @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); //让进度条消失 mPb.setVisibility(View.GONE); //让图片显示 mImage.setVisibility(View.VISIBLE); mImage.setImageBitmap(bitmap); } }}
ProgressBarActivity.java
package lzl.edu.com.asynctaskdemo;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.widget.ProgressBar;public class ProgressBarActivity extends Activity { android.widget.ProgressBar mPb_pb; MyAsyncTask mTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progress_bar); mPb_pb = (ProgressBar)findViewById(R.id.pb_pb); mTask = new MyAsyncTask(); mTask.execute(); } @Override protected void onPause() { super.onPause(); //当activity停止时,判断异步任务是否正在运行。如果正在运行,设置成cancel。然后在异步任务操作时调用 if(mTask!=null&&mTask.getStatus() == AsyncTask.Status.RUNNING){ mTask.cancel(true); } } class MyAsyncTask extends AsyncTask<Void,Integer,Void>{ @Override protected Void doInBackground(Void... params) { try{ for(int i=0;i<100;i++){ //每次进行异步操作时,判断该任务是否被取消。 if(isCancelled()){ break; } Thread.sleep(30); publishProgress(i); } }catch (Exception e){ e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Log.i("values",values[0]+""); mPb_pb.setProgress(values[0]); } }}
0 0
- AsyncTask 的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法(转)
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- Android AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- 在xcode中修改整个项目名
- c编译时的错误:程序中有游离的‘\240’‘\302’‘\XXX 时解决方案
- 地图定位
- eclipse打不开
- Spring4学习之从官网开始
- AsyncTask的用法
- LEETCODE-Merge Sorted Array
- 第八周项目1——建立顺序串的算法库
- Java泛型详解
- 怎样判断链表中有环
- JPA+Spring
- 网站开发相关基础知识点重拾(持续更新中)
- flowid与pkttype的区别,赋值与作用
- 一、JAVA基础视频01