Android 異步加載圖片-AsyncTask
AsyncTask定義了三種泛型類型 Params,Progress和Result。
?Params 啟動任務執行的輸入參數,比如HTTP請求的URL。
?Progress 后臺任務執行的百分比。
?Result 后臺執行任務最終返回的結果,比如String。
Activity
/*
- Android 異步任務AsyncTask
- AsyncTask定義了三種泛型類,Params,Progress,Result */ package rw.ansync;
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.ProgressBar;
public class AsynaTask_TestActivity extends Activity {
/* Called when the activity is first created. /
private EditText editText;
private Button button;
private ProgressBar progressBar;
private ImageView imageView;
private static final String URL_STRING="
}</pre>MyAsynaTask.java editText=(EditText) findViewById(R.id.editText1);
editText.setText(URL_STRING);
button=(Button) findViewById(R.id.button1);
progressBar=(ProgressBar) findViewById(R.id.progressBar1);
imageView=(ImageView) findViewById(R.id.imageView1);
button.setOnClickListener(new ButtonListener());
}
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
MyAsynaTask mTask=new MyAsynaTask(imageView, progressBar,button);
mTask.execute(URL_STRING);
}
}
package rw.ansync;
import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL;
import android.R.integer; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.IInterface; import android.util.Log; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar;
public class MyAsynaTask extends AsyncTask<STRING, bitmap="" integer,="">{
private ImageView imageView;
private ProgressBar progressBar;
private Button button;
public MyAsynaTask( ImageView imageView,
ProgressBar progressBar,Button button) {
super();
this.imageView = imageView;
this.progressBar = progressBar;
this.button=button;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
/*
* 改方法在執行實際的后臺操作時被UI線程調用,可以在該方法中做一些準備工作,比如
* Toast.makeText(context, "準備下載", Toast.LENGTH_LONG).show();
*/
super.onPreExecute();
}
@Override
protected Bitmap doInBackground(String... params) {//輸入編變長的可變參數 和UI線程中的Asyna.execute()對應
// TODO Auto-generated method stub
/*
* 該方法在OnpreExecute執行以后馬上執行,改方法執行在后臺線程當中,負責耗時的計算,可以調用publishProcess方法來實時更新任務進度
*/
Bitmap bitmap=null;
try {
URL url=new URL(params[0]);
Log.i("------------->", url+"");
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
connection.connect();
int MAX=connection.getContentLength();
progressBar.setMax(MAX);
InputStream inputStream=connection.getInputStream();
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
/*
* 為了顯示進度條,每接受1024字節要求更新一次UI,為了看效果
*/
byte []buf=new byte[1024];
int len = 0;
int processBarNum=0;
while( (len=inputStream.read(buf))!=-1){
outputStream.write(buf, 0, len);
processBarNum+=len;
publishProgress(processBarNum);//通知要更新processBar
}
bitmap=BitmapFactory.decodeByteArray(outputStream.toByteArray(),0, MAX);
inputStream.close();
} catch (Exception e) {
// TODO: handle exception
}
return bitmap;
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
/*
* 當publichProcess 唄調用以后,UI線程將調用這個有方法在界面上展示任務的情況,比如一個額進度條。這里是更新進度條
*/
int value=values[0];
progressBar.setProgress(value);
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
/*
* 在doInbackground執行完成以后,onPostExecute將被調用,后臺的結果將返回給UI線程,將獲得圖片顯示出來
*/
imageView.setImageBitmap(result);
super.onPostExecute(result);
}
}</STRING,></pre>加上權限<uses-permission android:name="android.permission.INTERNET"></uses-permission>
轉自:http://blog.csdn.net/rwyz1314/article/details/6841639