Android 多线程:这是一份详细的AsyncTask使用教程

展开阅读全文

android 源码:AsyncTask执行多线程

02-28

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

没有更多推荐了,返回首页