android 异步加载网络图片,(转)Android开发_异步加载网络图片_异步任务加载网络图片_线程加载图片...

我们知道,如果要加载一个很耗时的操作,会阻塞主线程,这时我们可以想到开启一个新的线程,避免阻塞,在android中也有这样的问题,我们可以用异步任务来操作,异步任务也是开启一个线程,线程里面发一个消息,然后通知去改变UI。

Android开发_异步加载网络图片_异步任务加载网络图片_线程加载图片

废话不多说,我们先看一个例子:我们可以打开这个网址:http://img1.3lian.com/img2011/07/20/05.jpg可以看到一副很好看的图片,我们就要把这个图片显示出来,首先,还是先要布局,我们要显示一幅图片,所以我们的布局中需要一个ImageView,布局很简单,一个ImageView就可以了:

android:layout_width="match_parent" android:layout_height="match_parent">

android:layout_width="match_parent" android:layout_height="match_parent"/> 

之后我们要写一个Activity显示这个图片,不过要加载网络上的图片,我们需要从一个URL的流中获取这个图片,所以我们要写一个方法来获取这张图片:

1 publicDrawable loadImages(String url) {2 try{3 returnDrawable.createFromStream((InputStream)(newURL(url)).openStream(),"test");4 }5 catch(IOException e) {6 e.printStackTrace();7 }8 returnnull;9 }

从URL中打开流,强制转换成InputStream,然后从流中拿到Drawable。

既然可以获取图片了,我们要考虑一个问题,如果图片很大,加载的很慢怎么办,我们岂不是要等很久?不要紧,这时候我们就可以用异步任务了。

首先我们要写一个内部类,这个类部类是继承自异步任务的,需要重载里面的doBackGround方法:

1

private class ImageAsynTask extends AsyncTask {

@Override

protected Drawable doInBackground (Void... params) {

String url = "http://img1.3lian.com/img2011/07/20/05.jpg";

return loadImages(url);

}

@Override

protected void onPostExecute (Drawable result) {

super.onPostExecute(result);

mDialog.dismiss();

mImage.setImageDrawable(result);

}

@Override

protected void onPreExecute () {

super.onPreExecute();

mDialog.show();

}

}

@Override

protected void onDestroy () {

super.onDestroy();

mDialog.dismiss();

}

return null;

}

首先看这个方法:onPreExecute()这个方法是在doInBackGround前面执行。我们把这个方法写出来,我们需要在获取图片之

前等待的时间里,写一个progressDialog,显示出来,提示用户,目前正在加载图片,需要等待一段时间。同时在后台操作

doBackGround运行。

在doBackGround完成之后就会执行onPostExecute(Drawable

result)方法,看这个方法就知道,必须在doBackGround完成之后,把得到的结果Drawable作为参数传到onPostExecute

方法里面去,执行这个方法就表示已经加载完了,我们需要将progressDialog消失掉,然后把图片显示出来就可以了,整个过程很简单。

看下整个Activity的代码:

package com.test.asyntask;

import java.io.IOException;

import java.io.InputStream;

import java.net.URL;

import android.app.Activity;

import android.app.ProgressDialog;

import android.graphics.drawable.Drawable;

import android.os.AsyncTask;

import android.os.Bundle;

import android.widget.ImageView;

import com.test.R;

public class AsynTask extends Activity {

private

ImageView mImage;

private

ProgressDialog mDialog;

@Override

protected

void onCreate (Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.asyn_task);

mDialog = new ProgressDialog(this);

mDialog.setTitle("请稍等");

mDialog.setMessage("正在加载...");

mImage = (ImageView) findViewById(R.id.img);

new ImageAsynTask().execute();

}

private

class ImageAsynTask extends AsyncTask

Drawable> {

@Override

protected Drawable doInBackground (Void... params) {

String url = "http://img1.3lian.com/img2011/07/20/05.jpg";

return loadImages(url);

}

@Override

protected void onPostExecute (Drawable result) {

super.onPostExecute(result);

mDialog.dismiss();

mImage.setImageDrawable(result);

}

@Override

protected void onPreExecute () {

super.onPreExecute();

mDialog.show();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值