在我们的手机软件中,经常需要用到联网操作,看视频,看图片,新闻等等都需要联网,网络操作属于耗时操作,在Android3.0版本之后,就不允许在主线程中执行网络操作了,但子线程中又不能进行ui操作,所以就出现了AsyncTask也就是今天说的异步任务,既可以进行耗时操作,又能改变ui现在就用异步任务来下载并且显示网络图片吧!
新建一个类,集成AsyncTask其中doInBackgroud方法是在子线程中执行,是必须要实现的方法
异步任务是专门用来进行网络操作的,里面有三个参数,四个方法,下面是代码
/** * Created by Vincent on 2016/8/26. * AsyncTask<String,Void,String>第一个参数,传入的参数, * 第二个参数,进度,第三个参数,返回结果
*/
public class MyAsyncTask extends AsyncTask<String, Void, byte[]> { ImageView imageView; public MyAsyncTask(ImageView imageView) { this.imageView = imageView; } //执行完doInBackground调用 此处的参数就是doInBackground的返回值 //此方法在主线程中执行,可以进行ui操作 @Override protected void onPostExecute(byte[] bytes) { BitmapFactory bitmapFactory = new BitmapFactory(); //根据拿到的byte数组转化为bitmap对象 Bitmap bitmap = bitmapFactory.decodeByteArray(bytes, 0, bytes.length); //imageView设置bitmap imageView.setImageBitmap(bitmap); } //主方法在子线程中执行 @Override protected byte[] doInBackground(String... params) { byte[] bytes = new HttpUtils().onGet(params[0]); return bytes; } //进度监听方法 @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); } //在doInBackground执行之前执行,一般不使用 @Override protected void onPreExecute() { super.onPreExecute(); } }
其中 HttpUtils是我抽出来的一个工具类,专门用来进行网络操作,下面是此类的代码
public class HttpUtils { //address 传过来的url地址 public byte[] onGet(String address) { InputStream is=null; ByteArrayOutputStream os = null; try { //把String转化为url URL url = new URL(address); //强转成HttpURLConnection HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //得到返回码 int code = connection.getResponseCode(); //判断返回码如果返回200则请求成功 if (code== 200){ is = connection.getInputStream();//拿到输入流 os=new ByteArrayOutputStream();//拿到字节输出流 //读取到的字节长度 int len=0; //一次读1024个字节 byte [] bytes=new byte[1024]; //循环读取,直到读取完毕 while ((len=is.read(bytes))>0){ //把is中的数据写入到输出流中 os.write(bytes,0,len); } Log.e("ByteArray()=", os.toByteArray()+""); return os.toByteArray(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { //关闭流 if (os!=null){ try { os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); } } if (is!=null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } }
准备好了 下面是调用了,在主布局中放入一个ImagView用于显示图片
下面是MainActivity中调用的代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = (ImageView) findViewById(R.id.iv); MyAsyncTask myAsyncTask = new MyAsyncTask(imageView);//把ImageView传过去 myAsyncTask.execute("http://p4.so.qhmsg.com/t01aade72dccf26cffe.jpg");//图片地址传过去,并执行 }
对了,千万别忘了在ManiFest中加入网络权限
<uses-permission android:name="android.permission.INTERNET"/>
运行项目,看效果
成功!