Android中AsyncTask异步任务使用详细实例(一)
AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。
使用AsyncTask最少要重写以下两个方法:
1、doInBackground(Params…)后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
2、onPostExecute(Result)在这里面可以使用在doInBackground得到的结果处理操作UI。此方法在主线程执行,任务执行的结果作为此方法的参数返回。
MainActivity如下:
packagecom.example.asynctasktest; importjava.io.ByteArrayOutputStream; importjava.io.InputStream; importorg.apache.http.HttpEntity; importorg.apache.http.HttpResponse; importorg.apache.http.HttpStatus; importorg.apache.http.client.HttpClient; importorg.apache.http.client.methods.HttpGet; importorg.apache.http.impl.client.DefaultHttpClient; importandroid.app.Activity; importandroid.os.AsyncTask; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.ProgressBar; importandroid.widget.TextView; importandroid.widget.Toast; publicclassMainActivityextendsActivity{ privateButtonsatrtButton; privateButtoncancelButton; privateProgressBarprogressBar; privateTextViewtextView; privateDownLoaderAsyncTaskdownLoaderAsyncTask; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); initView(); } publicvoidinitView(){ satrtButton=(Button)findViewById(R.id.startButton); cancelButton=(Button)findViewById(R.id.cancelButton); satrtButton.setOnClickListener(newButtonOnClickListener()); cancelButton.setOnClickListener(newButtonOnClickListener()); progressBar=(ProgressBar)findViewById(R.id.progressBar); textView=(TextView)findViewById(R.id.textView); } privateclassButtonOnClickListenerimplementsOnClickListener{ publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.startButton: //注意: //1每次需new一个实例,新建的任务只能执行一次,否则会出现异常 //2异步任务的实例必须在UI线程中创建 //3execute()方法必须在UI线程中调用。 downLoaderAsyncTask=newDownLoaderAsyncTask(); downLoaderAsyncTask.execute("http://www.baidu.com"); break; caseR.id.cancelButton: //取消一个正在执行的任务,onCancelled()方法将会被调用 downLoaderAsyncTask.cancel(true); break; default: break; } } } //构造函数AsyncTask<Params,Progress,Result>参数说明: //Params启动任务执行的输入参数 //Progress后台任务执行的进度 //Result后台计算结果的类型 privateclassDownLoaderAsyncTaskextendsAsyncTask<String,Integer,String>{ //onPreExecute()方法用于在执行异步任务前,主线程做一些准备工作 @Override protectedvoidonPreExecute(){ super.onPreExecute(); textView.setText("调用onPreExecute()方法--->准备开始执行异步任务"); System.out.println("调用onPreExecute()方法--->准备开始执行异步任务"); } //doInBackground()方法用于在执行异步任务,不可以更改主线程中UI @Override protectedStringdoInBackground(String...params){ System.out.println("调用doInBackground()方法--->开始执行异步任务"); try{ HttpClientclient=newDefaultHttpClient(); HttpGetget=newHttpGet(params[0]); HttpResponseresponse=client.execute(get); if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ HttpEntityentity=response.getEntity(); InputStreamis=entity.getContent(); longtotal=entity.getContentLength(); ByteArrayOutputStreambos=newByteArrayOutputStream(); byte[]buffer=newbyte[1024]; intcount=0; intlength=-1; while((length=is.read(buffer))!=-1){ bos.write(buffer,0,length); count+=length; //publishProgress()为AsyncTask类中的方法 //常在doInBackground()中调用此方法 //用于通知主线程,后台任务的执行情况. //此时会触发AsyncTask中的onProgressUpdate()方法 publishProgress((int)((count/(float)total)*100)); //为了演示进度,休眠1000毫秒 Thread.sleep(1000); } returnnewString(bos.toByteArray(),"UTF-8"); } }catch(Exceptione){ returnnull; } returnnull; } //onPostExecute()方法用于异步任务执行完成后,在主线程中执行的操作 @Override protectedvoidonPostExecute(Stringresult){ super.onPostExecute(result); Toast.makeText(getApplicationContext(),"调用onPostExecute()方法--->异步任务执行完毕",0).show(); //textView显示网络请求结果 textView.setText(result); System.out.println("调用onPostExecute()方法--->异步任务执行完毕"); } //onProgressUpdate()方法用于更新异步执行中,在主线程中处理异步任务的执行信息 @Override protectedvoidonProgressUpdate(Integer...values){ super.onProgressUpdate(values); //更改进度条 progressBar.setProgress(values[0]); //更改TextView textView.setText("已经加载"+values[0]+"%"); } //onCancelled()方法用于异步任务被取消时,在主线程中执行相关的操作 @Override protectedvoidonCancelled(){ super.onCancelled(); //更改进度条进度为0 progressBar.setProgress(0); //更改TextView textView.setText("调用onCancelled()方法--->异步任务被取消"); System.out.println("调用onCancelled()方法--->异步任务被取消"); } } }
main.xml如下:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/startButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="开始异步任务"/> <Button android:id="@+id/cancelButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="取消异步任务"/> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:max="100" android:progress="0"/> <ScrollView android:id="@+id/scrollView" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="testtest"/> </ScrollView> </LinearLayout>
以上内容是小编给大家介绍的Android中AsyncTask异步任务使用详细实例(一),希望对大家有所帮助!