<p>AsyncTask的使用方法和理解</p><p>1、对于耗时的操作,我们的一般方法是开启&quot;子线程&quot;。如果需要更新UI,则需要使用handler</p><p>2、如果耗时的操作太多,那么我们需要开启太多的子线程,这就会给系统带来巨大的负担,随之也会带来性能方面的问题。在这种情况下我们就可以考虑使用类AsyncTask来异步执行任务,不需要子线程和handler,就可以完成异步操作和刷新UI。</p><p>3、AsyncTask:对线程间的通讯做了包装,是后台线程和UI线程可以简易通讯:后台线程执行异步任务,将result告知UI线程。</p><p>4、使用方法:共分为两步,自定义AsyncTask,在耗时的地方调用自定义的AsyncTask。可以参照以下代码示例。</p><p>step1:继承AsyncTask&lt;Params,Progress,Result&gt;</p><p> Params:输入参数。对应的是调用自定义的AsyncTask的类中调用excute()方法中传递的参数。如果不需要传递参数,则直接设为Void即可。</p><p> Progress:子线程执行的百分比</p><p> Result:返回值类型。和doInBackground()方法的返回值类型保持一致。</p><p>step2:实现以下几个方法:执行时机和作用看示例代码,以下对返回值类型和参数进行说明</p><p> onPreExecute():无返回值类型。不传参数</p><p> doInBackground(Params... params):返回值类型和Result保持一致。参数:若无就传递Void;若有,就可用Params</p><p> publishProgress(Params... params):在执行此方法的时候会直接调用onProgressUpdate(Params... values)</p><p> onProgressUpdate(Params... values):无返回值类型。参数:若无就传递Void;若有,就可用Progress</p><p> onPostExecute(Result result) :无返回值类型。参数:和Result保持一致。</p><p>step3:在调用自定义的AsyncTask类中生成对象;</p><p> 执行 :对象.excute(Params... params);</p><p>小注:</p><p> 1) Task的实例必须在UI thread中创建</p><p></p><p> 2) execute方法必须在UI thread中调用</p><p></p><p> 3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground=\&#39;#\&#39;&quot; onProgressUpdate(Progress...)这几个方法</p><p></p><p> 4) 该task只能被执行一次,否则多次调用时将会出现异常</p><p></p><p>示例代码:</p><pre class="brush:xml;toolbar:false">&lt;?xmlversion=&quot;1.0&quot;encoding=&quot;utf-8&quot;?&gt; &lt;LinearLayoutxmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; android:orientation=&quot;vertical&quot; android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;fill_parent&quot; &gt; &lt;TextView android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;wrap_content&quot; android:text=&quot;Hello,WelcometoAndy&#39;sBlog!&quot;/&gt; &lt;Button android:id=&quot;@+id/download&quot; android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;wrap_content&quot; android:text=&quot;Download&quot;/&gt; &lt;TextView android:id=&quot;@+id/tv&quot; android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;wrap_content&quot; android:text=&quot;当前进度显示&quot;/&gt; &lt;ProgressBar android:id=&quot;@+id/pb&quot; android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;wrap_content&quot; style=&quot;?android:attr/progressBarStyleHorizontal&quot;/&gt; &lt;/LinearLayout&gt;</pre><p>package sn.demo;</p><pre class="brush:java;toolbar:false">importandroid.content.Context; importandroid.os.AsyncTask; importandroid.util.Log; importandroid.widget.ProgressBar; importandroid.widget.TextView; publicclassDownloadTaskextendsAsyncTask&lt;Integer,Integer,String&gt;{ //后面尖括号内分别是参数(线程休息时间),进度(publishProgress用到),返回值类型 privateContextmContext=null; privateProgressBarmProgressBar=null; privateTextViewmTextView=null; publicDownloadTask(Contextcontext,ProgressBarpb,TextViewtv){ this.mContext=context; this.mProgressBar=pb; this.mTextView=tv; } /* *第一个执行的方法 *执行时机:在执行实际的后台操作前,被UI线程调用 *作用:可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。 *@seeandroid.os.AsyncTask#onPreExecute() */ @Override protectedvoidonPreExecute(){ //TODOAuto-generatedmethodstub Log.d(&quot;sn&quot;,&quot;00000&quot;); super.onPreExecute(); } /* *执行时机:在onPreExecute方法执行后马上执行,该方法运行在后台线程中 *作用:主要负责执行那些很耗时的后台处理工作。可以调用publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。 *@seeandroid.os.AsyncTask#doInBackground(Params[]) */ @Override protectedStringdoInBackground(Integer...params){ //TODOAuto-generatedmethodstub Log.d(&quot;sn&quot;,&quot;1111111&quot;); for(inti=0;i&lt;=100;i++){ mProgressBar.setProgress(i); publishProgress(i); try{ Thread.sleep(params[0]); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } return&quot;执行完毕&quot;; } /* *执行时机:这个函数在doInBackground调用publishProgress时被调用后,UI线程将调用这个方法.虽然此方法只有一个参数,但此参数是一个数组,可以用values[i]来调用 *作用:在界面上展示任务的进展情况,例如通过一个进度条进行展示。此实例中,该方法会被执行100次 *@seeandroid.os.AsyncTask#onProgressUpdate(Progress[]) */ @Override protectedvoidonProgressUpdate(Integer...values){ //TODOAuto-generatedmethodstub Log.d(&quot;sn&quot;,&quot;2222222222&quot;); mTextView.setText(values[0]+&quot;%&quot;); super.onProgressUpdate(values); } /* *执行时机:在doInBackground执行完成后,将被UI线程调用 *作用:后台的计算结果将通过该方法传递到UI线程,并且在界面上展示给用户 *result:上面doInBackground执行后的返回值,所以这里是&quot;执行完毕&quot; *@seeandroid.os.AsyncTask#onPostExecute(java.lang.Object) */ @Override protectedvoidonPostExecute(Stringresult){ //TODOAuto-generatedmethodstub Log.d(&quot;sn&quot;,&quot;3333333333&quot;); super.onPostExecute(result); } }</pre><p>package sn.demo;</p><pre class="brush:java;toolbar:false">importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.ProgressBar; importandroid.widget.TextView; publicclassAsyncTaskDemoActivityextendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ privateButtondownload; privateTextViewtv; privateProgressBarpb; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); initView(); } privatevoidinitView(){ //TODOAuto-generatedmethodstub tv=(TextView)findViewById(R.id.tv); pb=(ProgressBar)findViewById(R.id.pb); download=(Button)findViewById(R.id.download); download.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub DownloadTaskdt=newDownloadTask(AsyncTaskDemoActivity.this,pb,tv); dt.execute(100); } }); } }</pre>
RangeTime:0.010474s
RangeMem:211.6 KB
返回顶部 留言