AsyncTask

AsyncTask一般包括以下幾個步驟:
1.execute(Params... params),執行一個異步任務,需要我們在代碼中調用此方法,觸發異步任務的執行。
2.onPreExecute(),在execute(Params... params)被調用後立即執行,一般用來在執行後臺任務前對UI做一些標記。
3.doInBackground(Params... params),在onPreExecute()完成後立即執行,用於執行較爲費時的操作,此方法將接收輸入參數和返回計算結果。在執行過程中可以調用publishProgress(Progress... values)來更新進度信息。
4.onProgressUpdate(Progress... values),在調用publishProgress(Progress... values)時,此方法被執行,直接將進度信息更新到UI組件上。
5.onPostExecute(Result result),當後臺操作結束時,此方法將會被調用,計算結果將做爲參數傳遞到此方法中,直接將結果顯示到UI組件上。
在使用的時候,有幾點需要格外注意:
1.異步任務的實例必須在UI線程中創建。
2.execute(Params... params)方法必須在UI線程中調用。
3.不要手動調用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)這幾個方法。
4.不能在doInBackground(Params... params)中更改UI組件的信息。
5.一個任務實例只能執行一次,如果執行第二次將會拋出異常。

public class AsyncTaskActivity extends Activity {
    
	private ImageView mImageView;
	private Button mButton;
//	private ProgressBar mProgressBar;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mImageView= (ImageView) findViewById(R.id.imageView);
        mButton = (Button) findViewById(R.id.button);
 //       mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
        mButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				LogoTask task = new LogoTask();
				task.execute("http://avatar.csdn.net/0/C/6/1_li_zhuonan.jpg");
			}
		});
    }
    ProgressDialog mypDialog;
    public void show_dialog()
    {
    	mypDialog=new ProgressDialog(this);
        //實例化
        mypDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        //設置進度條風格,風格爲圓形,旋轉的
        mypDialog.setTitle("正在登錄中,請稍後...");
        mypDialog.setIndeterminate(false);
        //設置ProgressDialog 的進度條是否不明確
        mypDialog.setCancelable(true);
        //設置ProgressDialog 是否可以按退回按鍵取消
        mypDialog.show();
        //讓ProgressDialog顯示
    }
    public void cancel_dialog()
    {
    	mypDialog.dismiss();
    }
    
    class LogoTask extends AsyncTask<String,Integer,Bitmap> {//繼承AsyncTask

		@Override
		protected Bitmap doInBackground(String... params) {//處理後臺執行的任務,在後臺線程執行
	//		publishProgress(0);//將會調用onProgressUpdate(Integer... progress)方法
			
			HttpClient hc = new DefaultHttpClient();
			publishProgress(30);
			HttpGet hg = new HttpGet(params[0]);//獲取csdn的logo
			final Bitmap bm;
			try {
				HttpResponse hr = hc.execute(hg);
				bm = BitmapFactory.decodeStream(hr.getEntity().getContent());
			} catch (Exception e) {
				
				return null;
			}
			publishProgress(100);
			//mImageView.setImageBitmap(result); 不能在後臺線程操作ui
			return bm;
		}
		
		protected void onProgressUpdate(Integer... progress) {//在調用publishProgress之後被調用,在ui線程執行
		//	mProgressBar.setProgress(progress[0]);
			//更新進度條的進度
			if(progress[0]==30)
			{
				show_dialog();
			}
			else
			{
				cancel_dialog();
			}
			
	     }

	     protected void onPostExecute(Bitmap result) {//後臺任務執行完之後被調用,在ui線程執行
	    	 if(result != null) {
	    		 Toast.makeText(AsyncTaskActivity.this, "成功獲取圖片", Toast.LENGTH_LONG).show();
	    		 mImageView.setImageBitmap(result);
	    	 }else {
	    		 Toast.makeText(AsyncTaskActivity.this, "獲取圖片失敗", Toast.LENGTH_LONG).show();
	    	 }
	     }
	     
	     protected void onPreExecute () {//在 doInBackground(Params...)之前被調用,在ui線程執行
	    	 mImageView.setImageBitmap(null);
	    	 //mProgressBar.setProgress(0);//進度條復位
	     }
	     
	     protected void onCancelled () {//在ui線程執行
	    	 //mProgressBar.setProgress(0);//進度條復位
	    	 mypDialog.dismiss();
	     }
    	
    }
    

}


附上demo下載地址:下載網絡圖片


發佈了34 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章