android - AsyncTask 的使用_第1张图片

android中AsyncTask异步任务的使用

1.关于AsyncTask

在android中实现异步任务有两种方法:一种为通过多线程Thread配合Handler实现,另一种就是通过android为我们提供的AsyncTask来实现。AsyncTask使得编写异步任务更加简单。
public abstract class AsyncTaskextends Object java.lang.Object ↳ android.os.AsyncTask

Params代表:启动任务执行的输入参数
Progress代表:后台任务执行的进度
Result代表:后台计算结果的类型
泛型指定不是必须的,在特定情况下不需要用到的可以传Void类型代替。

2.相关的重要方法

通过自定义的类继承AsyncTask类并指定泛型对应类型创建自己的异步任务类 privateclassMyTaskextendsAsyncTask{...}

一个异步任务的执行一般包括以下几步:

1.finalAsyncTask

execute(Params...);
此方法是异步任务的启动入口,该方法应该在UI线程中调用,调用此方法时会让任务以单线程队列方式或线程池队列的方式运行,具体取决于版本不同而不同,Parames对应定义子类时指定的Params,比如若指定为String类型,则MyTask.execute("afds","ffdf","www","ff");。

2.void onPreExecute();

该方法在execute方法调用后立即执行,可以用来完成在开启线程执行异步任务之前的操作,如标记一个异步任务即将开始,如让一个ProgressBar控件可见。

3.Result

doInBackground(Params...);
AsyncTask子类必须覆写方法,该方法在AsyncTask创建的线程中执行,该方法在onPreExecute方法后立即执行,用于执行费事操作,类似Thread中的run方法。此方法接收输入参数(即execute中传入的参数),并在异步任务完成后返回结果,执行期间可以调用void publishProgress(Progress... values)方法实时将进度信息传递给void onProgressUpdate(Progress...values)方法(若调用了publishProgress方法则MyTask方法中也应覆写onProgressUpdate方法);

4.void onProgressUpdate(Progress...);

该方法在UI线程中执行,接收publishProgress方法传来的参数,更新UI。

5.void onPostExecute(Result);

该方法在UI线程中执行,接收doInBackground方法返回的参数,处理异步所得结果。

注意事项:
1.异步任务的子类的实例应在UI线程中创建
2.除execute方法外,doInBackground、onPreExecute、onProgressUpdate。onPostExecute方法不能手动调用,而publishProgress方法只能在doInBackground方法中调用
3.doInBackground方法是在与UI线程不同的线程中执行的,因而不能再该方法中操作UI
4.一个任务实例只能执行一次
(以上内容转自:http://blog.csdn.net/liuhe688/article/details/6532519)

3.Demo

demo实现功能为从网络异步下载一张图片

public class DemoActivity extends Activity {        private ProgressBar progressBar;        private ImageView imageView;        private TextView textView;        private Button button;        private final String url = "http://www.bz55.com/uploads/allimg/150720/139-150H0110922.jpg";        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.demo_layout);            progressBar = (ProgressBar) findViewById(R.id.demo_progressBar);          progressBar.setVisibility(View.INVISIBLE);          imageView = (ImageView) findViewById(R.id.demo_image);          textView = (TextView) findViewById(R.id.demo_showProgress);          button = (Button) findViewById(R.id.demo_button);          button.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View view) {                  imageView.setImageBitmap(null);                  new MyTask().execute(url);              }          });      }        private class MyTask extends AsyncTask      {            @Override          protected void onPreExecute() {              super.onPreExecute();              textView.setText("异步开始");              progressBar.setVisibility(View.VISIBLE);          }            @Override          protected Bitmap doInBackground(String... strings) {              publishProgress("正在下载图片");              return getBitmapFromUrl(strings[0]);          }            @Override          protected void onProgressUpdate(String... values) {              super.onProgressUpdate(values);              textView.setText(values[0]);          }            @Override          protected void onPostExecute(Bitmap bitmap) {              super.onPostExecute(bitmap);              imageView.setImageBitmap(bitmap);              textView.setText("下载结束");              progressBar.setVisibility(View.INVISIBLE);          }        }          public Bitmap getBitmapFromUrl(String urlString) {          Bitmap bitmap;          InputStream is = null;            try {              URL url = new URL(urlString);              HttpURLConnection connection = (HttpURLConnection) url.openConnection();              is = new BufferedInputStream(connection.getInputStream());              bitmap = BitmapFactory.decodeStream(is);              connection.disconnect();              //Log.i("image", "getBitmapFromUrl: true");              return bitmap;            } catch (MalformedURLException e) {              e.printStackTrace();          } catch (IOException e) {              e.printStackTrace();          } finally {              try {                  is.close();              } catch (IOException e) {                  e.printStackTrace();              }          }          return null;      }    }  

布局

<?xml version="1.0" encoding="utf-8"?>                

别忘了添加网络访问权限

最终效果


更多相关文章

  1. android屏幕自适应4方法案例整合
  2. 打开SDK Manager检查Android SDK下载和更新失败的解决方法
  3. android studio 3.6.0 绑定视图新特性的方法
  4. androidSDK无法更新的解决方法之一
  5. android全屏去掉title栏的多种实现方法
  6. View类的XML属性、相关方法及说明
  7. android 中隐藏EditText的下划线方法
  8. Android 线程超时的例子
  9. Android调用系统默认浏览器访问的方法

随机推荐

  1. Android(安卓)Installation error: INSTA
  2. android 2.3 4.0 添加开机音乐
  3. Android获取屏幕的宽和高
  4. AutoCompleteTextView与MultiAutoComplet
  5. android超快模拟器Ggenymotion的安装和配
  6. Android(安卓)自定义像素AVD模拟器无键盘
  7. Android(安卓)如何通过menu id来得到menu
  8. Android(安卓)中文API (37) —— AbsoluteL
  9. android 各类开源项目整理 包括 个性化控
  10. Android(安卓)WebView 实例