国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

Android:多線程之AsyncTask

2019-11-02 15:23:15
字體:
來源:轉載
供稿:網友

 AsyncTask

  AsyncTask,異步任務,可以簡單進行異步操作,并把執行結果發布到UI主線程。AsyncTask是一個抽象類,它的內部其實也是結合了Thread和Handler來實現異步線程操作,但是它形成了一個通用線程框架,更清晰簡單。AsyncTask應該被用于比較簡短的操作(最多幾秒鐘)。如果需要保持長時間運行的線程,可以使用ThreadPooExecutor或者FutureTask,關于這兩個類的內容,以后再介紹,本片博客主要介紹AsyncTask。

  AsyncTask被定義為一個操作,運行在一個后臺線程中,其結果被發布在UI線程上。它的異步工作的參數與返回值被泛型的三個參數指定:Params、Progress、Result。AsyncTask將經歷4個步驟:onPreExecute、doInBackground、onProgressUpdate、onPostExecute。下面詳細講解這三個參數與四個步驟:

  三個泛型參數:

Params:被發送到執行任務的參數類型。 Progress:進度的類型,發送后臺的計算進度到UI線程類型。 Result:異步任務的返回結果類型。

  一個異步任務將經歷四個階段:

onPreExecute():執行在UI線程上調用執行任務之前,一般用于設置任務。 doInBackground(Params...):主要是用來執行異步任務的耗時操作,可以在這個方法中通過publishProgress()方法發布進度信息,并在執行完成之后,返回執行結果。 onProgreddUpdate(Progress...):在UI線程上接受doInBackground()傳遞過來的進度信息,并在UI線程上展示進度信息,它執行的時機是不確定的。 onPostExecute(Result):在UI線程上操作doInBackground()執行的返回值。

  上面介紹的四個步驟的示意圖:

AsyncTask取消任務

  在程序的任何位置,都可以通過cancel(boolean)方法進行取消任務,當取消任務之后,會改變isCancelled()的返回值,使其返回true。之后會調用onCancelled(Object)方法,替代onPostExecute()得到doInBackground()的返回結果。在運行中,可以經常通過isCancelled()方法查看任務是否被取消。

 

AsyncTask的使用規則

  使用AsyncTask必須遵循以下規則:

%20%20%20%20AsyncTask必須聲明在UI線程上。%20%20%20%20AsyncTask必須在UI線程上實例化。%20%20%20%20必須通過execute()方法執行任務。%20%20%20%20不可以直接調用onPreExecute()、onPostExecute(Resut)、doInBackground(Params...)、onProgressUpdate(Progress...)方法。%20%20%20%20可以設置任務只執行一次,如果企圖再次執行會報錯。

示例

  一個簡單的示例,通過AsyncTask下載一個網絡上的圖片,下載的時候展示一個等待框,并顯示在一個ImageView中。

  實現代碼:

%201%20package%20com.bgxt.datatimepickerdemo;%202%20%203%20import%20org.apache.http.HttpEntity;%204%20import%20org.apache.http.HttpResponse;%205%20import%20org.apache.http.client.HttpClient;%206%20import%20org.apache.http.client.methods.HttpGet;%207%20import%20org.apache.http.impl.client.DefaultHttpClient;%208%20import%20org.apache.http.util.EntityUtils;%209%2010%20import%20android.app.Activity;11%20import%20android.app.ProgressDialog;12%20import%20android.graphics.Bitmap;13%20import%20android.graphics.BitmapFactory;14%20import%20android.os.AsyncTask;15%20import%20android.os.Bundle;16%20import%20android.view.View;17%20import%20android.widget.Button;18%20import%20android.widget.ImageView;19%2020%20public%20class%20AsyncTaskActivity1%20extends%20Activity%20{21%20%20%20%20%20private%20Button%20btnDown;22%20%20%20%20%20private%20ImageView%20ivImage;23%20%20%20%20%20private%20static%20String%20image_path%20=%20"http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg";24     private ProgressDialog dialog;25 26     @Override27     protected void onCreate(Bundle savedInstanceState) {28         // TODO Auto-generated method stub29         super.onCreate(savedInstanceState);30         setContentView(R.layout.asynctask_activity);31 32         btnDown = (Button) findViewById(R.id.btnDown);33         ivImage = (ImageView) findViewById(R.id.ivSinaImage);34         35         // 聲明一個等待框以提示用戶等待36         dialog=new ProgressDialog(this);37         dialog.setTitle("提示信息");38         dialog.setMessage("正在下載,請稍后...");39         40         btnDown.setOnClickListener(new View.OnClickListener() {41 42             @Override43             public void onClick(View v) {44                 // 執行一個異步任務,并把圖片地址以參數的形式傳遞進去45                 new MyTask().execute(image_path);46             }47         });48     }49 50     // 以String類型的參數,Void表示沒有進度信息,Bitmap表示異步任務返回一個位圖51     public class MyTask extends AsyncTask<String, Void, Bitmap> {52         // 表示任務執行之前的操作53         @Override54         protected void onPreExecute() {55             super.onPreExecute();56             //顯示等待框57             dialog.show();58         }59 60         //主要是完成耗時操作61         @Override62         protected Bitmap doInBackground(String... params) {63             HttpClient httpClient=new DefaultHttpClient();64             HttpGet httpGet=new HttpGet(params[0]);65             Bitmap bitmap=null;66             try {67                 //從網絡上下載圖片68                 HttpResponse httpResponse =httpClient.execute(httpGet);69                 if(httpResponse.getStatusLine().getStatusCode()==200){70                     HttpEntity httpEntity = httpResponse.getEntity();71          
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西畴县| 灵石县| 舟曲县| 濉溪县| 专栏| 海门市| 大悟县| 渝中区| 娱乐| 盱眙县| 邯郸县| 博野县| 疏附县| 香河县| 上蔡县| 中西区| 株洲市| 横山县| 明光市| 平果县| 佛教| 奉贤区| 丹江口市| 屏东县| 滦南县| 玉门市| 黄龙县| 聂荣县| 绵阳市| 宜都市| 正镶白旗| 黄骅市| 兴义市| 鹤山市| 鄢陵县| 房产| 玛多县| 安泽县| 尖扎县| 色达县| 镇康县|