AsyncTask介绍Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。AsyncTask定义了三种泛型类型Params,Progress和Result。Params启动任务执行的输入参数,比如HTTP请求的URL。Progress后台任务执行的百分比。Result后台执行任务最终返回的结果,比如String。使用过AsyncTask的同学都知道一个异步加载数据最少要重写以下这两个方法:doInBackground(Params…)后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。onPostExecute(Result)相当于Handler处理UI的方式,在这里面可以使用在doInBackground得到的结果处理操作UI。此方法在主线程执行,任务执行的结果作为此方法的参数返回有必要的话你还得重写以下这三个方法,但不是必须的:onProgressUpdate(Progress…)可以使用进度条增加用户体验度。此方法在主线程执行,用于显示任务执行的进度。onPreExecute()这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。onCancelled()用户调用取消时,要做的操作使用AsyncTask类,以下是几条必须遵守的准则:Task的实例必须在UIthread中创建;execute方法必须在UIthread中调用;不要手动的调用onPreExecute(),onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)这几个方法;该task只能被执行一次,否则多次调用时将会出现异常;一个超简单的理解AsyncTask的例子://MainActivitypublicclassMainActivityextendsActivity{privateButtonbutton;privateProgressBarprogressBar;privateTextViewtextView;privateImageViewimage;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(Button)findViewById(R.id.button03);progressBar=(ProgressBar)findViewById(R.id.progressBar02);textView=(TextView)findViewById(R.id.textView01);image=(ImageView)findViewById(R.id.imageView1);button.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){image.setImageBitmap(null);ProgressBarAsyncTaskasyncTask=newProgressBarAsyncTask(textView,progressBar,image,MainActivity.this);asyncTask.execute("http://pic2.nipic.com/20090501/1412106_052409063_2.jpg");}});}}//异步加载类/***生成该类的对象,并调用execute方法之后*首先执行的是onProExecute方法*其次执行doInBackgroup方法**/publicclassProgressBarAsyncTaskextendsAsyncTask<String,Integer,String>{privateTextViewtextView;privateProgressBarprogressBar;privateContextmContext;privateBitmapmap;privateImageViewmImage;publicProgressBarAsyncTask(TextViewtextView,ProgressBarprogressBar,ImageViewimage,Contextcontext){super();this.textView=textView;this.progressBar=progressBar;this.mContext=context;this.mImage=image;}/***执行execute(params)方法后运行顺序*1、onPreExecute()*2、doInBackground()*3、onProgressUpdate()如果2调用了publishProgress()方法*4、onPostExecute()***onPreExecute()该方法为前期准备工作*该方法运行在UI线程当中,并且运行在UI线程当中可以对UI控件进行设置**/protectedvoidonPreExecute(){textView.setText("开始执行异步线程");}/***这里的Integer参数对应AsyncTask中的第一个参数*这里的String返回值对应AsyncTask的第三个参数*该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改*但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作**/protectedStringdoInBackground(String...params){NetOperatornetOperator=newNetOperator();inti=0;for(i=1;i<=10;i++){map=netOperator.operator(params[0]);//耗时操作publishProgress(i*10);//下面这句对进度条进行刷新}returnparams[0];}/***这里的Integer参数对应AsyncTask中的第二个参数*在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行*onProgressUpdate是在UI线程中执行,*所以可以对UI控件进行操作**/protectedvoidonProgressUpdate(Integer...values){intvlaue=values[0];progressBar.setProgress(vlaue);}/***这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)*在doInBackground方法执行结束之后再运行,*并且运行在UI线程当中*可以对UI控件进行刷新设置*/protectedvoidonPostExecute(Stringresult){Toast.makeText(mContext,"异步操作结束",Toast.LENGTH_SHORT).show();mImage.setImageBitmap(map);textView.setText("异步操作执行结束\n"+result);}}
//耗时类(下载图片)//模拟网络环境publicclassNetOperator{publicNetOperator(){}publicBitmapoperator(Stringparams){try{Thread.sleep(100);Bitmapbitmap=null;HttpClientclient=newDefaultHttpClient();//params代表连接的url,即图片地址URIuri=URI.create(params);HttpGetget=newHttpGet(uri);HttpResponseresponse=client.execute(get);HttpEntityentity=response.getEntity();longlength=entity.getContentLength();Log.i("qwe",""+length);InputStreamin=entity.getContent();if(in!=null){ByteArrayOutputStreambaos=newByteArrayOutputStream();bitmap=BitmapFactory.decodeStream(in);in.close();baos.close();}returnbitmap;}catch(Exceptione){e.printStackTrace();}returnnull;}}


//.xml布局文件

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:id="@+id/textView01"android:layout_width="fill_parent"android:layout_height="wrap_content"/><ProgressBarandroid:id="@+id/progressBar02"style="?android:attr/progressBarStyleHorizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/button03"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="点击下载图片"/><ImageViewandroid:id="@+id/imageView1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="0.44"/></LinearLayout>


更多相关文章

  1. Android线程优先级设置方法
  2. 【Android】设置tabhost位于底部的三种方法
  3. Mars Android视频学习笔记——01_16_SQLite使用方法
  4. 如何在Android中用好多线程
  5. Android 总结:进阶之路(资源与方法)
  6. Android 关闭所有Activity完全退出程序方法
  7. android 图文列表的实现方法
  8. 使用universal-image-loader中出现的EOFException解决方法
  9. android之sharedpreference存储参数

随机推荐

  1. animated-rotate的用法
  2. Android(安卓)selector 及 Shape
  3. EditText小总结
  4. android manifest.xml中元素含义android
  5. 【Android】Android(安卓)代码判断是否获
  6. 最新Android(安卓)ADT, SDK, SDK_tool等
  7. Android(安卓)PagerTabStrip和PagerTitle
  8. [Android]"@string/hello"和"你好"的区别
  9. Android(安卓)布局属性详解
  10. RelativeLayout 重要的属性