Android 异步任务AsyncTask类的简单使用

来源:互联网 发布:情侣店铺淘宝 编辑:程序博客网 时间:2024/04/30 04:57

* 说实话,对应这个类,我还是比较陌生的。虽然知道是大概是怎么一回事。但是没有具体的去使用过。一般都是new Thread()+Handler去解决子线程更新UI的问题。

* 不过看了慕课网 http://www.imooc.com/video/7314 对于AsyncTask的讲解,非常容易理解,于是就写了一个简单的使用AsyncTask加载网络图片的Demo。

1. 加载网络资源,添加一个用户权限:

 <uses-permission android:name="android.permission.INTERNET" />

2.写一个布局文image_activity.xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <ImageView        android:id="@+id/imageview"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:contentDescription="@string/action_settings"        android:padding="16dp" />    <ProgressBar        android:id="@+id/progressbar"        style="?android:attr/progressBarStyleHorizontal"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:visibility="gone" /></RelativeLayout>


3.Activity代码:(使用AsyncTask加载网络图片)


 

package com.example.asynctask;import java.io.BufferedInputStream;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;import android.annotation.SuppressLint;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.widget.ImageView;import android.widget.ProgressBar;public class ImageTestActivity extends Activity {private static final String URL = "http://news.cnr.cn/native/gd/20150930/W020150930482969794794.jpg";//private static final String URL1 = "http://diopic.net/images/2015/10/02/ebcf3a897c69cacc2ee81a47751defa4.jpg";private static final String URL2 = "http://att.bbs.duowan.com/forum/201304/18/0932088bi83i3si8s8gdbb.jpg";private ImageView imageView;private ProgressBar progressBar;private MyAsyncTask task;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.image_activity);imageView = (ImageView) findViewById(R.id.imageview);progressBar = (ProgressBar) findViewById(R.id.progressbar);task = new MyAsyncTask();task.execute(URL2);}@Overrideprotected void onPause() {if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) {task.cancel(true);}super.onPause();}/** * 加载网络图片的异步任务<br> * String--传入的参数, Void--进度参数, Bitmap--返回参数 */class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {@Overrideprotected void onPreExecute() {// 异步任务开始执行前调用的方法UIsuper.onPreExecute();progressBar.setVisibility(View.VISIBLE);progressBar.setMax(100);}@Overrideprotected void onPostExecute(Bitmap result) {// 异步任务执行完成调用的方法 UIsuper.onPostExecute(result);progressBar.setVisibility(View.GONE);if (result == null) {imageView.setImageResource(R.drawable.ic_launcher);} else {imageView.setImageBitmap(result);}}@SuppressLint("NewApi")@Overrideprotected Bitmap doInBackground(String... params) {if (isCancelled()) {return null;}// 异步任务执行耗时操作调用的方法 非UIBitmap bitmap = null;String url = params[0];URLConnection connection;InputStream is;try {for (int i = 0; i < 88; i++) {publishProgress(i);//Thread.sleep(100);}connection = new URL(url).openConnection();is = connection.getInputStream();System.out.println("isLegnth=" + is.available());BufferedInputStream bis = new BufferedInputStream(is);bitmap = BitmapFactory.decodeStream(bis);System.out.println("bitmap=" + bitmap.getByteCount());bis.close();is.close();} catch (Exception e) {e.printStackTrace();}return bitmap;}@Overrideprotected void onProgressUpdate(Integer... values) {if (isCancelled()) {return;}super.onProgressUpdate(values);progressBar.setProgress(values[0]);}}}


代码运行ok.

 

* 关于AsyncTask,有几点注意:

*  *  1. 就是AsyncTask的三个参数:<Params, Progress, Result> 分别是:Params=需要传入的参数(可以不传,不传就Void);Progress=显示进度的参数。(一般是Integer,或者不搞进度就Void);  Result=异步任务执行的结果。比如我是需要加载图片,那么我就让Result=Bitmap。(没有返回结果就Void);

* *  2. AsyncTask有一个task.cancel();的方法,以及一个 task.isCancelled();方法。一个是发送取消异步任务的请求,一个是判断是否发送过这样的请求。一般可以通过isCancelled();的方法去改变doInBackground(..);方法里面的逻辑,比如:如果有取消的请求,就提前return,否则就正常执行。

 

0 0