您的位置:首页 > 移动开发 > Android开发

Android 异步加载图片

2016-03-01 18:50 453 查看
1.构建AsyncTask子类参数:

有三个泛型参数:AsyncTask<Params,Progress,Result>

指定三个泛型参数:params:启动任务时输入参数类型;

Progress:后台执行中返回进度值类型

Result:后台执行任务完成后返回结果类型

2.构建AsyncTask 子类回调方法:

doInBackground();必须重写,后台线程将要完成的任务;

doPreExecute:完成初始化操作;

doPostExecute:doInBackground()中返回值传递给该方法;

onProgressUpdate():在doInBackground()方法中调用publishProgress()方法,更新任务执行进度后,就会触发该方法。

3.AsyncTask 使用的注意要点:

(1)必须在UI 线程中创建实例,调用execute()方法;

(2)每个AsyncTask 只能够调用execute()方法一次,不能重复调用;

(3)只有doInBackground()在其他线程中,不能直接更新UI,其他回调方法可以更新UI.

(4)AsyncTask底层还是线程池,当前面task没有完成,后面也不会执行,所以要有个cancel task 的步骤。

但是要注意task.cancel(true)方法只是将task标记为cancel,所以在其他回调方法中需要检查isCancelled()

下面是两个简单的AsyncTask 的例子:

1.这是一个模拟进度条的主要代码:

<strong style="color: rgb(255, 0, 0);"> </strong>class MyAsyncTask extends AsyncTask<Void,Integer,Void>{
@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}

@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if(isCancelled()){
return;
}
progressBar.setProgress(values[0]);
}

@Override
protected Void doInBackground(Void... params) {
//模拟进度更新
for (int i = 0; i <100; i++) {
if(isCancelled()){
break;
}
publishProgress(i);
try {
Thread.sleep(300);//增加睡眠时间

} catch (InterruptedException e) {
e.printStackTrace();
}
}

return null;
}
}


2.这是模拟从网络上加载图片的主要代码:

class MySyncTask extends AsyncTask<String,Void,Bitmap>{

@Override
protected Bitmap doInBackground(String... params) {
String url=params[0];
InputStream is;
Bitmap bm=null;
HttpURLConnection conn;

try {
conn= (HttpURLConnection) new URL(url).openConnection();
is=conn.getInputStream();
BufferedInputStream bis=new BufferedInputStream(is);//为什么要用包装流
bm= BitmapFactory.decodeStream(bis);
is.close();
bis.close();

} catch (IOException e) {
e.printStackTrace();
}

return bm;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
pb.setVisibility(View.VISIBLE);
}

@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
im.setImageBitmap(bitmap);
pb.setVisibility(View.GONE);
}

@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);

}
}


然后只要在主线程中创建实例,调用execute()方法即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: