最近在学习AsyncTask,先看下AsyncTask的定义:
public abstract class AsyncTask<Params, Progress, Result>
Params-启动任务时执行的输入参数。
Progress-后台任务执行的进度。
Result-任务结束后所返回的结果。
并不是所有的参数都会被用到,如果没有用到则用Void代替。
AsyncTask 主要有如下方法:
execute((Params... params)方法:启动AsyncTask。要在UI线程中执行
四大方法:
onPreExecute()方法;第一个执行的方法
doInBackground(Params... params)方法:执行完onPreExecute()方法后便开始执行,耗时操作都在这里执行。并返回计算结果onProgressUpdate(Progress... values)方法:与doInBackground(Params... params)方法一起执行,并将进度更新到UI组件中。onPostExecute(Result result)方法:当doInBackground(Params... params)方法执行完后便开始执行。得到doInBackground(Params... params)方法返回的计算结果,在此方法中与UI线程中交互。以上四个方法不能手动调用。doInBackground(Params... params)方法不能与UI进行交互
开始AsyncTask网络加载图片实例:
package com.example.kira.newasycndemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ImageView; import android.widget.ProgressBar; public class MainActivity extends AppCompatActivity { private ProgressBar mprogressBar; private ImageView imageView; private static String URL="https://img-my.csdn.net/uploads/201504/12/1428806103_9476.png"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image); mprogressBar= (ProgressBar) findViewById(R.id.pb); imageView= (ImageView) findViewById(R.id.image); MyAsycnTask my=new MyAsycnTask(MainActivity.this,imageView,mprogressBar); my.execute(URL); } }
MyAsycnTask类:
<pre name="code" class="java">package com.example.kira.newasycndemo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Created by Kira on 2016/9/24.
*/
public class MyAsycnTask extends AsyncTask<String,Void,Bitmap> {
//String-传入的地址是String类型的,Void-不需要看到后台任务的执行程度,故为Void, Bitmap-最后返回一个Bitmap类型。
private Context context;
private ImageView img;
private ProgressBar progressBar;
MyAsycnTask(Context context, ImageView img, ProgressBar progressBar)
{
this.context=context;
this.img=img;
this.progressBar=progressBar;
}
@Override
protected Bitmap doInBackground(String... params) {//String... params代表可以传入多个参数进来
Log.i("=====","doInBackground");
String url=params[0];//因为只有一个参数传进来,所以直接params[0],将第一个参数取出来即可。
try {
URL u=new URL(url);
HttpURLConnection conn= (HttpURLConnection) u.openConnection();//打开链接
conn.setRequestMethod("GET"); //设置请求方法
conn.setReadTimeout(5*1000); //设置延迟时间
InputStream is = null; //创建输入流
int code= conn.getResponseCode();
if (code==200)
{
is=conn.getInputStream(); //获取输入流
BufferedInputStream bis=new BufferedInputStream(is); //创建缓冲区,提高效率。
Thread.sleep(5*1000);//让线程进行休眠,方便看到进度条更新。
Bitmap bitmap= BitmapFactory.decodeStream(bis); //获得Bitmap
is.close();
bis.close();
return bitmap;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
Log.i("=====","onPreExecute");
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
Log.i("=====","onPostExecute");
super.onPostExecute(bitmap);
img.setImageBitmap(bitmap);
progressBar.setVisibility(View.GONE);
}
}
布局文件:
image.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:padding="10dp">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/pb"
android:layout_width="90dp"
android:layout_height="90dp"
android:visibility="gone"
android:layout_centerInParent="true"/>
</RelativeLayout>
记得在AndroidManifest中获取网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>