AsyncTask———理解和应用

来源:互联网 发布:七天优品:网络骗局多 编辑:程序博客网 时间:2024/05/16 00:54

前言:

首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。

AsyncTask简介:

AsyncTask 的优势体现在:

1、线程的开销较大,如果每个任务都要创建一个线程,那么应用程 序的效率要低很多;

2、线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。

3、另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。

AsyncTask定义了三种泛型类型 Params,Progress和Result。

1、Params 启动任务执行的输入参数,比如HTTP请求的URL。

2、Progress 后台任务执行的百分比。

3、Result 后台执行任务最终返回的结果,比如String。

AsyncTask的执行分为四个步骤:

onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。

doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。

onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。

onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.

另外注意:

使用AsyncTask类,以下是几条必须遵守的准则:

1) Task的实例必须在UI thread中创建

2) execute方法必须在UI thread中调用

3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法

4) 该task只能被执行一次,否则多次调用时将会出现异常

示例:使用异步AsyncTask下载网络图片和进度条加载
MainActivity代码如下:
import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}//下载网络图片public void Loadimage(View view){startActivity(new Intent(this, imagetest.class));}//进度条加载public void Loading(View view){startActivity(new Intent(this, progressbar.class));}}
下载网络图片AsyncTask代码如下:
import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URLConnection;import java.net.*;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 imagetest extends Activity {private ImageView mimageview;private ProgressBar mprogressbar;//自定义一个网络图片URL;private static String URL="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1500011575&di=031987ff6f15b3f13ff7ffbce37c7425&imgtype=jpg&er=1&src=http%3A%2F%2Fimg4.duitang.com%2Fuploads%2Fitem%2F201510%2F07%2F20151007215248_yikZv.jpeg ";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.image);mimageview=(ImageView) findViewById(R.id.imageView1);mprogressbar=(ProgressBar) findViewById(R.id.progressBar1);new myasynctask().execute(URL);}class myasynctask extends AsyncTask<String, Void, Bitmap>{@Overrideprotected void onPreExecute() {mprogressbar.setVisibility(View.VISIBLE);super.onPreExecute();}@Overrideprotected void onPostExecute(Bitmap bitmap) {super.onPostExecute(bitmap);mprogressbar.setVisibility(View.GONE);mimageview.setImageBitmap(bitmap);}@Overrideprotected void onProgressUpdate(Void... values) {// TODO Auto-generated method stubsuper.onProgressUpdate(values);}@Overrideprotected Bitmap doInBackground(String... params) {String url=params[0];Bitmap bitmap=null;URLConnection connection;InputStream is;try {connection=new URL(url).openConnection();is=connection.getInputStream();BufferedInputStream bis=new BufferedInputStream(is);bitmap=BitmapFactory.decodeStream(bis);Thread.sleep(3000);is.close();bis.close();} catch (Exception e) {e.printStackTrace();}return bitmap;}}}
进度条加载代码如下:
import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.widget.ProgressBar;public class progressbar extends Activity{private ProgressBar pb;private myasynctask my;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.progress);pb=(ProgressBar)findViewById(R.id.pb);my=new myasynctask();my.execute();}@Overrideprotected void onPause() {super.onPause();if(my!=null&&my.getStatus()==AsyncTask.Status.RUNNING){my.cancel(true);}}class myasynctask extends AsyncTask<Void, Integer, Void>{@Overrideprotected void onProgressUpdate(Integer... values) {super.onProgressUpdate(values);//取出进度值pb.setProgress(values[0]);}@Overrideprotected Void doInBackground(Void... params) {//更新进度值,模拟进度栏分析for(int i=0;i<100;i++){if(my.isCancelled()){break;}publishProgress(i);try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}}return null;}}}


原创粉丝点击