package com.example.day07_asynctask_method; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.util.Log; import android.view.Menu; import android.view.View; /** 1.问题:当我们请求网络数据,解析大数据,读写大数据时 ,需要进行耗时操作---用户体验差 当用户频繁的执行耗时操作时,会出现程序无法响应异常 当用户进行操作(如点击屏幕),程序在5s内没有进行响应,就会出现程序无法响应异常---anr异常 原因:阻塞了主线程 解决: 把耗时操作放到子线程中去执行 2.问题: Only the original thread that created a view hierarchy can touch its views. 只能在主线程(ui线程)中进行ui的修改操作 解决:把数据发送到主线程,让主线程去修改ui 3.asyncTask 异步任务 --- 在子线程中进行耗时操作,耗时操作完后自动的将数据发送到主线程,用户在主线程进行数据操作 1.去继承asyncTask抽象类 2.实现未实现的方法 3.调用,执行该类 * * @author my * */ public class MainActivity extends Activity { public static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //下载图片按钮点击事件 public void onDownLoadImg(View v){ //执行异步任务 new MyAsynctask().execute("需传参数"); } /** * 方法执行顺序 onPreExecute-doInBackground--onPostExecute * @author my * */ class MyAsynctask extends AsyncTask<String, Integer, Bitmap>{ /** * 在主线程中执行--在doInBackground方法前执行,通常显示正在加载提示 */ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); Log.i(TAG, "MainActivity--onPreExcute--threadName ="+Thread.currentThread().getName()+",id = "+Thread.currentThread().getId()); } /* * 在子线程中执行--执行耗时操作, * 参数类型与该类泛型的第一个参数一致,与执行者的execute的参数类型也对应,execute的参数会传到doInBackground方法中 * 返回值类型与类的第三个参数一致,与onPostExecute方法中传入的参数也一致 * 耗时操作执行完后才能后会将结果传给onPostExecute方法 * */ @Override protected Bitmap doInBackground(String... params) { // TODO Auto-generated method stub Log.i(TAG, "MainActivity--doInBackground--threadName ="+Thread.currentThread().getName()+",id = "+Thread.currentThread().getId()); return null; } /** * 在主线程中执行--用来处理结果(通常用来显示数据) * 会接收doInBackground传过来的数据 */ @Override protected void onPostExecute(Bitmap result) { // TODO Auto-generated method stub super.onPostExecute(result); Log.i(TAG, "MainActivity--onPostExecute--threadName ="+Thread.currentThread().getName()+",id = "+Thread.currentThread().getId()); } /** * 用来更新进度时调用--在主线程中执行 * 调用需要用户去执行 * 参数类型与该类泛型的第二个参数对应,一般表示当前的加载进度 */ @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); } } }