实例:从网络上下载一个图片,然后放到ImageView中,是用AsyncTask来实现的,本身逻辑也很简单,仅是在doInBackground中用HTTP请求把图片的输入流取出,然后用BitmapFactory去解析,然后再把得到的Bitmap放到ImageView中。
需要深入了解的可以参考:http://blog.csdn.net/hitlion2008/article/details/7983449
特别注意增加增加网络权限。。。。
MainActivity.java
package com.example.day07_homework_asynctask;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
/**
* 异步任务显示图片
* 特别注意:从网络下载图片需要开启网络权限
*/
public class MainActivity extends Activity implements OnClickListener{
private Button button;
private ImageView imageView;
String path="https://www.baidu.com/img/bd_logo1.png";//网络上的图片资源
ProgressDialog progressDialog;//声明进度条组件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化组件
initView();
}
private void initView() {
button =(Button) findViewById(R.id.button);
imageView=(ImageView) findViewById(R.id.imageView);
//给button设置监听
button.setOnClickListener(this);
//创建进度条组件
progressDialog=new ProgressDialog(this);
progressDialog.setTitle("正在加载");
//设置进度条标题图片
progressDialog.setIcon(R.drawable.ic_launcher);
//设置进度条显示内容
progressDialog.setMessage("玩命加载中...");
//设置进度条样式(环形或条形),本例为了显示百分比,使用进度条(环形没有百分比之说)
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
}
/**
* 主线程不能直接连接网路,需要子线程从网络获取数据,然后以io形式穿给主线程
* @author Administrator
*注意三个参数
* class MyTask extends AsyncTask<Params, Progress, Result>
* “启动任务执行的输入参数”
* “后台任务执行的进度”--》一般使用Integer
* “后台计算结果的类型”
* 从网路下载图片,使用byte[]数组
*/
class MyTask extends AsyncTask<String, Integer, byte[]>{
/**
* 显示进度条(环)
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
//注意doInBackground返回的值传给了onPostExecute去更新ui
@Override
protected byte[] doInBackground(String... params) {
//可变长参数,传来的是path网址
String iamge_path =params[0];
URL url =null;
InputStream inputStream = null;
Byte[]result =null;
try {
url =new URL(iamge_path);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.connect();
if(conn.getResponseCode()==200){
int len =0;
inputStream =conn.getInputStream();
ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
int length =0;
//获取文件的总长度,为显示进度条做准备,注意只有进度条才可以显示百分比,环形不可以
int filelength=conn.getContentLength();
byte [] buffer =new byte[1024];
//循环读入网络传下来的数据
while((len=inputStream.read(buffer))!=-1){
//获取读取了的文件长度,为进度条更新时使用
length+=len;
int progess =(int) ((length/(float)filelength)*100);
publishProgress(progess);
//将buffer中的数据读入byteArrayOutputStream
byteArrayOutputStream.write(buffer,0,len);
//防止速度过快,为了看清进度条,加延时
Thread.sleep(1000);
}
//返回值byte数组,给onPostExcute更新ui
return byteArrayOutputStream.toByteArray();
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
//更新进度条(环)
//在重写方法时,注意一定将类的参数填好之后再重写,避免出错
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
//可变长参数,注意
int progress_values=values[0];
//更新进度条(环)
progressDialog.setProgress(progress_values);
}
// 数据上穿后,更新ui界面
@Override
protected void onPostExecute(byte[] result) {
super.onPostExecute(result);
//数据上穿完成后,进度条(环)销毁
progressDialog.dismiss();
//bitmap的使用,将字节数组
Bitmap bm=BitmapFactory.decodeByteArray(result,0,result.length);
imageView.setImageBitmap(bm);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
//异步任务启动
new MyTask().execute(path);
break;
default:
break;
}
}
}
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center_vertical">
<Button
android:layout_gravity="center"
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="异步任务下载图片" />
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>