异步加载灵活运用

上代码:

public class MainActivity extends Activity implements OnClickListener{

private EditText editText;
private Button button;
private ProgressBar progressBar;
private ImageView imageView;
private static final String URL_STRING="http://www.kekegold.com/d/file/yule/hqdy/2015-03-30/3099344f74b1bd6a1ba3622bf19ed8a1.png";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

editText=(EditText) findViewById(R.id.editText1);
editText.setText(URL_STRING);
button=(Button) findViewById(R.id.button1);
progressBar=(ProgressBar) findViewById(R.id.progressBar1);
imageView=(ImageView) findViewById(R.id.imageView1);
button.setOnClickListener(this);
}
public class MyAsynaTask extends AsyncTask<String, Integer, Bitmap>{

private ImageView imageView;
private ProgressBar progressBar;
private Button button;

public MyAsynaTask( ImageView imageView,
ProgressBar progressBar,Button button) {
super();
this.imageView = imageView;
this.progressBar = progressBar;
this.button=button;
}
public MyAsynaTask( ImageView imageView,Button button) {
super();
this.imageView = imageView;
this.button=button;
}

@Override
protected void onPreExecute() {
// TODO Auto-generated method stub

/*
* 改方法在执行实际的后台操作时被UI线程调用,可以在该方法中做一些准备工作,比如
* Toast.makeText(context, "准备下载", Toast.LENGTH_LONG).show();
*/
super.onPreExecute();
}

@Override
protected Bitmap doInBackground(String... params) {//输入编变长的可变参数 和UI线程中的Asyna.execute()对应
// TODO Auto-generated method stub
/*
* 该方法在OnpreExecute执行以后马上执行,改方法执行在后台线程当中,负责耗时的计算,可以调用publishProcess方法来实时更新任务进度
*/
Bitmap bitmap=null;
try {
URL url=new URL(params[0]);
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
// progressBar.setMax(connection.getContentLength());

InputStream inputStream=connection.getInputStream();
bitmap=BitmapFactory.decodeStream(inputStream);
// inputStream.close();
/*
* 以下完全为了演示进度条,如果为了显示进度条可以把这个去掉
*/
/*
byte []buf=new byte[1024*4];
inputStream=connection.getInputStream();
int len=0;
while ((inputStream.read(buf))!=-1) {
len+=buf.length;
publishProgress(len);
}
*/

inputStream.close();

} catch (Exception e) {
// TODO: handle exception
}
return bitmap;
}

@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
/*
* 当publichProcess 呗调用以后,UI线程将调用这个有方法在界面上展示任务的情况,比如一个额进度条。这里是更新进度条
*/
int value=values[0];
progressBar.setProgress(value);
super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
/*
* 在doInbackground执行完成以后,onPostExecute将被调用,后台的结果将返回给UI线程,将获得图片显示出来
*/
imageView.setImageBitmap(result);
button.setText("下载完成");
super.onPostExecute(result);
}
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
MyAsynaTask mTask=new MyAsynaTask(imageView,button);
mTask.execute(URL_STRING);
break;

default:
break;
}
}
}

布局文件:

<RelativeLayout 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"
tools:context=".MainActivity" >

<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="20dp"
android:layout_alignParentRight="true" />

<ProgressBar
android:layout_below="@+id/editText1"
android:id="@+id/progressBar1"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText1"
android:layout_centerHorizontal="true"
android:layout_marginTop="62dp"
android:text="开始下载" />

<ImageView
android:layout_below="@+id/button1"
android:id="@+id/imageView1"
android:layout_width="400dp"
android:layout_height="300dp"
android:src="@drawable/ic_launcher"
/>
</RelativeLayout>

=============

加载一张图片效果很nice!

变一下,出现在listview场景中怎么用呢?

根据个人需求 比如我的是HorizontalListView

在HorizontalListViewAdapter中改到:

getView中改到:

MyAsynaTask mTask=new MyAsynaTask(holderView.imageView);
mTask.execute(mList.get(position).toString());

是不是感觉很happy呢?

我们搬的不是砖 是思想

另附 关于 缓存处理,下次再看吧

http://blog.csdn.net/zshshuai/article/details/7798086

感谢:http://www.linuxidc.com/Linux/2011-10/44388.htm

明天看看这个:http://blog.csdn.net/geniusxiaoyu/article/details/7470163

时间: 2024-10-12 08:27:00

异步加载灵活运用的相关文章

cocos2dx lua中异步加载网络图片,可用于显示微信头像

最近在做一个棋牌项目,脚本语言用的lua,登录需要使用微信登录,用户头像用微信账户的头像,微信接口返回的头像是一个url,那么遇到的一个问题就是如何在lua中异步加载这个头像,先在引擎源码里找了下可能会提供这个功能的地方,发现好像没有提供类似功能,那么只能自己动手写.所以我在ImageView这个类里面添加了一个成员方法,其实可以不写在ImageView里,而且我觉得非必需情况下还是不要修改引擎源码的好,因为如果源码改动比较多的话,将来引擎版本升级会比较麻烦.我写在ImageView里纯粹是想偷

Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚接触的人来说可能太少了,下面我就把我使用过程中所知道的写了下来,希望可以帮助自己和别人更深入了解这个库的使用和配置. GITHUB上的下载路径为:https://github.com/nostra13/Android-Universal-Image-Loader ,下载最新的库文件,并且导入到项目的

iOS开发swift版异步加载网络图片(带缓存和缺省图片)

iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存. 异步加载图片的核心代码如下:  func setZYHWebImage(url:NSString?, defaultImage:NSString?, isCache:Bool){         var ZYHImage:UIImage?         if url == nil {             return   

Android异步加载全解析之Bitmap

Android异步加载全解析之Bitmap 在这篇文章中,我们分析了Android在对大图处理时的一些策略--Android异步加载全解析之大图处理  戳我戳我 那么在这篇中,我们来对图像--Bitmap进行一个更加细致的分析,掌握Bitmap的点点滴滴. 引入 Bitmap这玩意儿号称Android App头号杀手,特别是3.0之前的版本,简直就是皇帝般的存在,碰不得.摔不得.虽然后面的版本Android对Bitmap的管理也进行了一系列的优化,但是它依然是非常难处理的一个东西.在Androi

Android异步加载全解析之开篇瞎扯淡

Android异步加载 概述 Android异步加载在Android中使用的非常广泛,除了是因为避免在主线程中做网络操作,更是为了避免在显示时由于时间太长而造成ANR,增加显示的流畅性,特别是像ListView.GridView这样的控件,如果getView的时间太长,就会造成非常严重的卡顿,非常影响性能. 本系列将展示在Android中如何进行异步加载操作,并使用ListView来作为演示的对象. 如何下载图像 下载自然是需要使用网络,使用网络就不能在主线程,在主线程就会爆炸.所以我们必须要在

Android异步加载全解析之使用多线程

异步加载之使用多线程 初次尝试 异步.异步,其实说白了就是多任务处理,也就是多线程执行,多线程那就会有各种问题,我们一步步来看,首先,我们创建一个class--ImageLoaderWithoutCaches,从命名上,大家也看出来,这个类,我们实现的是不带缓存的图像加载,不多说,我们再创建一个方法--showImageByThread,通过多线程来加载图像: /** * Using Thread * @param imageView * @param url */ public void sh

Android异步加载全解析之使用AsyncTask

Android异步加载全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅可以对并发线程进行管理,更可以提高他们执行的效率,优化整个App.当然我们可以自己创建一个线程池,不过这样是很烦的,要创建一个高效的线程池还是挺费事的,不过,Android系统给我吗提供了AsyncTask这样一个类,来帮助我们快速实现多线程开发,它的底层实现,其实就是一个线程池. AsyncTask初探 AsyncTask,顾名思义就是用来做异步处理的.通过AsyncTask,

Android异步加载全解析之大图处理

Android异步加载全解析之大图处理 异步加载中非常重要的一部分就是对图像的处理,这也是我们前面用异步加载图像做演示例子的原因.一方面是因为图像处理不好的话会非常占内存,而且容易OOM,另一方面,图像也比文字要大,加载比较慢.所以,在讲解了如何进行多线程.AsyncTask进行多线程加载后,先暂停下后面的学习,来对图像的异步处理进行一些优化工作. 为什么要对图像处理 为什么要对图像进行处理,这是一个很直接的问题,一张图像,不管你拿手机.相机.单反还是什么玩意拍出来,它就有一定的大小,但是在不同

jQuery_review 之 通过.load()方法来实现异步加载HTML文档

原生的ajax编写起来是相当麻烦的一件事情,我们不仅仅要处理不同浏览器下的XMLHttpRequest对象不同的初始化,还需要识记大量的XMLHttpRequest对象的属性和方法,而且做的很多都是重复性的工作,就如同jdbc的实现方式是一样的,JDBC有很多固定的模式,所以不管是Hibernate还是Ibatis亦或是Spring都使用模板模式来封装了大量相同的调用,让整个方法变得更加容易使用.对于程序员来说,这些都是一些非常好的事情,因为再也不用重复造轮子了,重复造轮子,成本高,性能也未必与