在我们的手机软件中,经常需要用到联网操作,看视频,看图片,新闻等等都需要联网,网络操作属于耗时操作,在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"/>
运行项目,看效果
成功!
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
