Android中多线程编程(四)AsyncTask类的详细解释(附源码)

Android中多线程编程(四)AsyncTask类的详细解释(附源码)

分类:app源码

Android中多线程编程中AsyncTask类的详细解释

1.Android单线程模型 2.耗时操作放在非主线程中执行

Android主线程和子线程之间的通信封装类:AsyncTask类 1.子线程中更新UI 2.封装、简化异步操作。 3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的。必须等前边的线程执行完毕后,后边的线程才能执行。

AsyncTask类使用注意事项:

1.在UI线程中创建AsyncTask的实例 2.必须在UI线程中调用AsyncTask的execute()方法 3.重写的四个方法是系统自动调用的,不应手动调用。 4.每个AsyncTask只能被执行一次。多次调用将会引发异常。

AsyncTask类和Handler类在异步任务中的比较:

(1).AsyncTask: 优点:简单快捷。过程可控。 缺点:在多个异步任务处理进行UI更新的时候,就显得复杂起来。

(2).Handler类: 优点:结构清晰,功能定义明确。对于多个后台任务时,简单,,清晰。 缺点:在单个后台异步处理时,代码相对来说过于多。

以下是从网络中获取图片并展示的例子: (1).MainActivity.java类:

package com.chengdong.su.asynctaskdemo;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.widget.ImageView;import android.widget.ProgressBar;import com.chengdong.su.asynctaskdemo.interfaces.AsyncT;import com.chengdong.su.asynctaskdemo1.R;{private ImageView mView = null;private ProgressBar mProgressBar = null;private String URL = “http://pic.nipic.com/2007-11-09/2007119122519868_2.jpg”;private AsyncT mT = null;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();mT = new AsyncT(this);mT.execute(URL);}/*** Activity退出的时候,Task的任务也相应的退出*/() {super.onPause();if (mT != null && mT.getStatus() != AsyncTask.Status.FINISHED) {mT.cancel(true);}}() {mView = (ImageView) findViewById(R.id.iv_show);mProgressBar = (ProgressBar) findViewById(R.id.pb_show);}public ImageView getView() {return mView;}public ProgressBar getProgressBar() {return mProgressBar;}}

(2).AsyncT.java类:

package com.chengdong.su.asynctaskdemo.interfaces;import java.io.BufferedInputStream;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import com.chengdong.su.asynctaskdemo.MainActivity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.text.TextUtils;import android.util.Log;import android.view.View;/** * * @author scd * */public <String, Void, Bitmap> {private String TAG = “AsyncT”;private MainActivity mContext;/*** 构造方法** @param mContext*/public AsyncT(MainActivity mContext) {super();this.mContext = mContext;}/*** 在主线程中运行*/@Overrideprotected void onPreExecute() {super.onPreExecute();// 显示mContext.getProgressBar().setVisibility(View.VISIBLE);}/*** 在子线程中运行*/@Overrideprotected Bitmap doInBackground(String… params) {/**** 若要实现页面退出时,异步任务也要停止,那么此处就需要根据业务来进行处理进行判断if(isCancelled()){}此处省略没实现。**/String url = params[0];HttpURLConnection connection = null;InputStream in = null;Bitmap bitmap = null;// 从网络中获取图片try {// 进行网络连接connection = (HttpURLConnection) new URL(url).openConnection();// 获得输入流in = connection.getInputStream();// 存放到缓存中BufferedInputStream bin = new BufferedInputStream(in);// 休眠Thread.sleep(3000);// 解析缓存中的输入流bitmap = BitmapFactory.decodeStream(bin);// 关闭数据流in.close();bin.close();return bitmap;} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}return null;}/*** 在UI线程中运行*/@Overrideprotected void onPostExecute(Bitmap result) {super.onPostExecute(result);mContext.getProgressBar().setVisibility(View.GONE);mContext.getView().setImageBitmap(result);}/*** 在UI线程中运行*/@Overrideprotected void onProgressUpdate(Void… values) {super.onProgressUpdate(values);}}

版权声明:本文为博主原创文章,未经博主允许不得转载。

上一篇Activity生命周期交互设计思想和应用场景(附源码)

顶0踩0

力微休负重,言轻莫劝人。

Android中多线程编程(四)AsyncTask类的详细解释(附源码)

相关文章:

你感兴趣的文章:

标签云: