AsyncTask执行多线程android源码
执行AsyncTask
onPreExecute()///首先执行这个方法,它在UI线程中 可以执行一些异步操作 比如初始化一些东西
doInBackground(Object... arg0) //异步后台执行 ,执行完毕可以返回出去一个结果object对象
onPostExecute(Object result) //可以拿到执行中的进度 当然进度须要在doInBackground中手动调用publishProgress()方法返回
通过例子可以清楚的看到计算出读取100张图片的时间,执行的效率上来说AsyncTask 没有Thread效率块,但是AsyncTask 比Thread更规整,它可是时时的拿到异步线程中进度以及最后的结果集,可以让我们的代码更佳规范。这里说一下 Thread能做到的事AsyncTask 都可以做到 但是AsyncTask 能做到的事Thread 不一定能做到就算勉强做到也很麻烦 。我给大家的建议是如果处理大量的异步操作就用AsyncTask 如果少部分的则使用Thread
import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class AsyncTaskActivity extends Activity {
/**执行Timer进度**/
public final static int LOAD_PROGRESS = 0;
/**关闭Timer进度**/
public final static int CLOSE_PROGRESS = 1;
/** 开始StartAsync按钮 **/
Button mButton0 = null;
/** 显示内容 **/
TextView mTextView = null;
Context mContext = null;
/**Timer对象**/
Timer mTimer = null;
/**TimerTask对象**/
TimerTask mTimerTask = null;
/**记录TimerID**/
int mTimerID = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.async);
mContext = this;
/** 拿到button 与 TextView 对象 **/
mButton0 = (Button) findViewById(R.id.button0);
mTextView = (TextView) findViewById(R.id.textView0);
//开始
mButton0.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//开始执行StartAsync
StartAsync();
}
});
super.onCreate(savedInstanceState);
}
public void StartAsync() {
new AsyncTask() {
@Override
protected void onPreExecute() {
//首先执行这个方法,它在UI线程中 可以执行一些异步操作
mTextView.setText("开始加载进度");
super.onPreExecute();
}
@Override
protected Object doInBackground(Object... arg0) {
//异步后台执行 ,执行完毕可以返回出去一个结果object对象
//得到开始加载的时间
Long startTime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
// 这里循环加载图片100遍
ReadBitMap(mContext, R.drawable.bg);
//执行这个方法会异步调用onProgressUpdate方法,可以用来更新UI
publishProgress(i);
}
//得到结束加载的时间
Long endTime = System.currentTimeMillis();
//将读取时间返回
return endTime - startTime;
}
@Override
protected void onPostExecute(Object result) {
//doInBackground之行结束以后在这里可以接收到返回的结果对象
mTextView.setText("读取100张图片一共耗时" + result+ "毫秒");
super.onPostExecute(result);
}
@Override
protected void onProgressUpdate(Object... values) {
//时时拿到当前的进度更新UI
mTextView.setText("当前加载进度" + values[0]);
super.onProgressUpdate(values);
}
}.execute();//可以理解为执行 这个AsyncTask
}
/**
* 读取本地资源的图片
*
* @param context
* @param resId
* @return
*/
public Bitmap ReadBitMap(Context context, int resId) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
// 获取资源图片
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);
}
}
------解决方案--------------------
值得学习学习!