1、Android 中的AsyncTask的使用心得
在android程式中一定不能阻塞UI線程,否則很容易就會彈出no respond 的對話方塊,導致程式退出。為了避免這種情況,一般需要較長時間執行的任務都放線上程中去執行,如從網上下載圖片在介面的某個地區顯示。但是使用線程回導致cpu開銷過大,並且當線程管理不好時也會彈出no respond框。android提供了AsyncTask類用來處理這種情況;例如需要下載圖片,然後在songImagButton中顯示,下載的邏輯在songImageButton的initImage方法中。
Java代碼
- private class DrawImageTask extends AsyncTask<Void,Integer,Void>{
- //更新圖片顯示地區,顯示圖片
- @Override
- protected void onPostExecute(Void params) {
- // TODO Auto-generated method stub
- songImageButton.invalidate();
- this.cancel(false);
- }
- //下載圖片
- @Override
- protected Void doInBackground(Void... params) {
- // TODO Auto-generated method stub
- songImageButton.initImage();
- return null;
- }
-
- }
一般在doInBackground中執行背景邏輯,如下載圖片或其他需要耗時間長度的任務,onPostExecute方法用來對介面進行操作。如果背景邏輯有傳回值,則由doInBackground返回然後傳入onPostExecute方法,然後更新介面。doInBackground方法和onPostExecute的參數必須對應,這兩個參數在AsyncTask聲明的泛型參數列表中指定,第一個為doInBackground接受的參數,第二個為顯示進度的參數,第第三個為doInBackground返回和onPostExecute傳入的參數。
當然我個人認為AsyncTask不能完全取代線程,在一些邏輯較為複雜或者需要在後台反覆執行的邏輯就可能需要線程來實現了。
2、從網路上下載一張圖片
package com.dream.androidresearch;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.net.HttpURLConnection;<br />import java.net.MalformedURLException;<br />import java.net.URL;<br />import android.app.Activity;<br />import android.graphics.Bitmap;<br />import android.graphics.BitmapFactory;<br />import android.os.AsyncTask;<br />import android.os.Bundle;<br />import android.view.View;<br />import android.view.View.OnClickListener;<br />import android.widget.Button;<br />import android.widget.ImageView;<br />import android.widget.ProgressBar;<br />public class AsynTaskTest extends Activity {<br />private String imageUrl = "http://hiphotos.baidu.com/baidu/pic/item/7d8aebfebf3f9e125c6008d8.jpg";<br />private String param = "";</p><p>private ProgressBar pbDownload;<br />private Button btnDownload;<br />private ImageView ivDownload;</p><p>@Override<br />protected void onCreate(Bundle savedInstanceState) {<br />// TODO Auto-generated method stub<br />super.onCreate(savedInstanceState);</p><p>this.setContentView(R.layout.asyntaks);</p><p>pbDownload = (ProgressBar) this.findViewById(R.id.pb_download);<br />btnDownload = (Button) this.findViewById(R.id.btn_download);<br />ivDownload = (ImageView) this.findViewById(R.id.iv_download);</p><p>pbDownload.setVisibility(View.GONE);</p><p>btnDownload.setOnClickListener(new OnClickListener()<br />{<br />@Override<br />public void onClick(View v) {<br />// TODO Auto-generated method stub<br />new myAsynTask().execute(param);<br />}</p><p>});</p><p>}<br />Bitmap getImageFromNetwork() {<br />URL myFileUrl = null;<br />Bitmap bitmap = null;<br />try {<br />myFileUrl = new URL(imageUrl);<br />} catch (MalformedURLException e) {<br />e.printStackTrace();<br />}<br />try {<br />HttpURLConnection conn = (HttpURLConnection) myFileUrl<br />.openConnection();<br />conn.setDoInput(true); </p><p>conn.connect();<br />InputStream is = conn.getInputStream(); </p><p>bitmap = BitmapFactory.decodeStream(is); </p><p>is.close();<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />System.out.println(bitmap==null);<br />System.out.println(myFileUrl.toString());<br />return bitmap;<br />} </p><p>class myAsynTask extends AsyncTask<String, Integer, Bitmap><br />{<br />@Override<br />protected Bitmap doInBackground(String... params) {<br />// TODO Auto-generated method stub<br />//return null;</p><p>Bitmap bitmap = getImageFromNetwork();<br />return bitmap;</p><p>}<br />@Override<br />protected void onPostExecute(Bitmap result) {<br />// TODO Auto-generated method stub<br />super.onPostExecute(result);</p><p>if(result != null)<br />ivDownload.setImageBitmap(result);<br />else<br />ivDownload.setBackgroundResource(R.drawable.icon);<br />pbDownload.setVisibility(View.GONE);</p><p>}<br />@Override<br />protected void onPreExecute() {<br />// TODO Auto-generated method stub<br />super.onPreExecute();</p><p>pbDownload.setVisibility(View.VISIBLE);<br />pbDownload.setProgress(0);</p><p>}<br />@Override<br />protected void onProgressUpdate(Integer... values) {<br />// TODO Auto-generated method stub<br />super.onProgressUpdate(values);</p><p>pbDownload.setProgress(values[0]);<br />}</p><p>}</p><p>}<br />
注意,需要在 manifest.xml 中添加網路許可權:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>