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
- Android AsyncTask使用详解
- AsyncTask---详解Android中AsyncTask的使用
- 【AsyncTask】详解Android中AsyncTask的使用
- Android AsyncTask的使用详解
- Android 详解AsyncTask的使用
- Android中AsyncTask使用详解
- Android中AsyncTask使用详解
- Android中AsyncTask使用详解
- Android中AsyncTask使用详解
- 详解Android中AsyncTask的使用
- 详解Android中AsyncTask的使用
- 详解Android中AsyncTask的使用
- 详解Android中AsyncTask的使用
- 详解Android中AsyncTask的使用
- 详解Android中AsyncTask的使用
- 详解Android中AsyncTask的使用
- 详解Android中AsyncTask的使用
- 详解Android中AsyncTask的使用
- c++
- UVa 12096 The SetStack Computer 【STL】【stack】
- rt2860v2源码分析三
- unity客户端
- ASP.NET MVC中使用Log4Net
- Android AsyncTask使用详解
- 算法分析课每周练习 Max Points on a Line
- [LeetCode] 91. Decode Ways
- ant使用
- nginx启用brotli压缩算法
- 文章标题
- 关于并行计算的一些名词
- jackjson实现javabean转换为json
- 1.2.4 Box of Bricks