继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android之网络操作异步任务的使用

开满天机
关注TA
已关注
手记 94
粉丝 74
获赞 262

在我们的手机软件中,经常需要用到联网操作,看视频,看图片,新闻等等都需要联网,网络操作属于耗时操作,在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"/>

运行项目,看效果

5bb821b00001171403840666.jpg

成功!

原文链接:http://www.apkbus.com/blog-843025-61553.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP