Android AsyncTask使用详解

来源:互联网 发布:布道者软件 编辑:程序博客网 时间:2024/06/05 16:11

声明:本文是shunWang原创文章,转载请注明出处:  http://shunji.wang/2017/02/26/asynctask/ ‎

要知道怎么使用AsyncTask首先得知道何为AsyncTask以及AsyncTask的作用,AsyncTask译成中文就是异步任务,在其内部封装了Handler机制,主要用来实现子钱程与UI线程的协同工作,比如子线程通知UI线程更新界面,所以AsyncTask的实质就是Google给我们封装好的Handler机制。

第一步:继承

AsyncTask是泛型抽象类,在使用前需要先创建一个类继承该抽象类,并实现其抽象方法。

public abstract class AsyncTask<Params, Progress, Result>     参数说明:     Params:启动AsyncTask时传入的数据类型(可为Void);     Progerss:表示进度的数据类型(可为Void);     Result:任务执行完毕后返回的数据类型(可为Void);第二步:实现抽象方法doInBackground;     @Override    protected Object doInBackground(Object[] objects) {    return null;      }第三步:重写三个方法,这四个方法的作用后面一点说,先说步骤;@Overrideprotected void onPreExecute() {    super.onPreExecute();}@Overrideprotected void onProgressUpdate(Object[] values) {    super.onProgressUpdate(values);}@Overrideprotected void onPostExecute(Object o) {    super.onPostExecute(o);}这四个方法的运行顺序见下图:方法说明:onPreExecute():在异步任务执行前被调用,做准备工作;doInBackground():执行后台任务,返回结果由onProgressUpdate()接收(注意此方法是在子线程中运行);onProgressUpdate():后台任务执行过程中调用publishProgress()方法更新任务进度时被调用;onPostExecute():当后台任务执行完之后被调用,用于返回结果;第四步:调用AsyncTask的实例方法execute()执行一个异步任务
任务的终止:@Overrideprotected void onCancelled() {    super.onCancelled();}
废话就只说这么多了,最后上完整的代码供大家参考:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void myClick(View view) { //创建异步任务并执行,参数传递给后台任务doInBackground new MyAsync().execute(1,2,3,4,5,6);    } class MyAsync extends AsyncTask<Integer,Integer,Bitmap>{ private ImageView imageView; private ProgressDialog dialog; //在异步任务执行之前被调用,做准备工作。(被UI线程调用) @Override protected void onPreExecute() { super.onPreExecute(); Log.d("FSLog","onPreExecute"); imageView = (ImageView) findViewById(R.id.imageView); dialog = new ProgressDialog(MainActivity.this); dialog.setMax(100); dialog.setTitle("正在下载。。。"); dialog.show();     } //执行后台任务 (后台线程调用) @Override protected Bitmap doInBackground(Integer... params) { Log.d("FSLog","doInBackground" + params[2]); //publishProgress(100);这里调用这个方法就会触发onProgressUpdate() HttpURLConnection conn = null; InputStream fis = null; Bitmap bitmap = null; try { URL url = new URL("http://192.168.1.104:8080/HttpUrlConnectionServer/TomCat.jpg"); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(3000); conn.setConnectTimeout(3000); conn.setDoOutput(false); conn.setDoInput(true); conn.setUseCaches(true); conn.connect(); if(!(conn.getResponseCode() == HttpURLConnection.HTTP_OK))   { return null;        } fis = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(fis); } catch (Exception e) { e.printStackTrace(); if(fis != null) { try { fis.close(); } catch (IOException e1) { e1.printStackTrace();    } } if(conn != null) { conn.disconnect();    } } return bitmap; } //当后台任务执行完之后被调用,用于返回结果 更新UI (被UI线程调用) @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); Log.d("FSLog","onPostExecute"); imageView.setImageBitmap(bitmap); dialog.dismiss(); } //后台任务执行过程中调用publishProgress()方法更新任务的进度时,被调用 (被UI线程调用) @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Log.d("FSLog","onProgressUpdate" + values[0]);     }   }}
0 0
原创粉丝点击