标签:
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;
public class MainActivity extends Activity {
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
mT = new AsyncT(this);
mT.execute(URL);
}
/**
* Activity退出的时候,Task的任务也相应的退出
*/
@Override
protected void onPause() {
super.onPause();
if (mT != null && mT.getStatus() != AsyncTask.Status.FINISHED) {
mT.cancel(true);
}
}
private void init() {
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 class AsyncT extends AsyncTask<String, Void, Bitmap> {
private String TAG = "AsyncT";
private MainActivity mContext;
/**
* 构造方法
*
* @param mContext
*/
public AsyncT(MainActivity mContext) {
super();
this.mContext = mContext;
}
/**
* 在主线程中运行
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
// 显示
mContext.getProgressBar().setVisibility(View.VISIBLE);
}
/**
* 在子线程中运行
*/
@Override
protected 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线程中运行
*/
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
mContext.getProgressBar().setVisibility(View.GONE);
mContext.getView().setImageBitmap(result);
}
/**
* 在UI线程中运行
*/
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android中多线程编程(四)AsyncTask类的详细解释(附源码)
标签:
原文地址:http://blog.csdn.net/u014225510/article/details/47264241