AsyncTask–實現從網路下載一張圖片的功能

來源:互聯網
上載者:User

1、Android 中的AsyncTask的使用心得

 

在android程式中一定不能阻塞UI線程,否則很容易就會彈出no respond 的對話方塊,導致程式退出。為了避免這種情況,一般需要較長時間執行的任務都放線上程中去執行,如從網上下載圖片在介面的某個地區顯示。但是使用線程回導致cpu開銷過大,並且當線程管理不好時也會彈出no respond框。android提供了AsyncTask類用來處理這種情況;例如需要下載圖片,然後在songImagButton中顯示,下載的邏輯在songImageButton的initImage方法中。

Java代碼 
  1.     private class DrawImageTask extends AsyncTask<Void,Integer,Void>{  
  2. //更新圖片顯示地區,顯示圖片  
  3.         @Override  
  4.         protected void onPostExecute(Void params) {  
  5.             // TODO Auto-generated method stub  
  6.             songImageButton.invalidate();  
  7.             this.cancel(false);  
  8.         }  
  9. //下載圖片  
  10.         @Override  
  11.         protected Void doInBackground(Void... params) {  
  12.             // TODO Auto-generated method stub  
  13.             songImageButton.initImage();  
  14.             return null;  
  15.         }  
  16.   
  17.     }  

  一般在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>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.