构建AsyncTask子类的回调方法:
1、doInBackground:必须重写(其它三个视情况而定),异步执行后台线程将要完成的任务;
2、onPreExecute:执行后台的耗时操作时被调用,通常用户在这里完成一些初始化操作;
3、onPostExecute:当doInBackground()完成后,系统会自动调用改方法,并将doInBackground方法返回的值传递给改方法;
4、onProgressUpdate:在doInBackground方法中调用publishProgress方法,更新任务的执行进度后,就会触发改方法;
注意:这几个方法时系统自动调用的,不应手动调用;并且每个AsyncTask只能被执行一次,否则会出现异常;
1、建立三个类,均继承Activity;
2、MainActivity的布局很简单,就两个按钮分别用于跳转到加载图片的类ImageLoad和加载进度条的类ProgressActivity:
public class MainActivity extends Activity
{
Button btn,btn2;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn);
btn2 = (Button)findViewById(R.id.btn2);
btn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
startActivity(new Intent(MainActivity.this, ImageLoad.class));
}
});
btn2.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
startActivity(new Intent(MainActivity.this, ProgressActivity.class));
}
});
}
}
3、ImageLoad类的布局:
<?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="8dp"
>
<ProgressBar
android:id="@+id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
ImageLoad类的实现代码:
public class ImageLoad extends Activity
{
private ImageView img;
private ProgressBar progress;
private final static String URL = "http://g.hiphotos.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=73c143f9ae51f3ded7bfb136f5879b7a/6d81800a19d8bc3e5fe28df9838ba61ea8d3451f.jpg";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.image_layout);
img = (ImageView)findViewById(R.id.img);
progress = (ProgressBar)findViewById(R.id.progress);
MyAsyncTask task = new MyAsyncTask();
task.execute(URL); //传递进去的值;
}
class MyAsyncTask extends AsyncTask<String, Void, Bitmap> //Url类型, 进度值类型, 返回值类型;
{
@Override
protected void onPreExecute() //在初始化操作中显示进度条;
{
super.onPreExecute();
progress.setVisibility(View.VISIBLE);
}
@Override
protected Bitmap doInBackground(String... params)
{
String url = params[0]; //获取传递进来的值;
Bitmap bitmap = null;
InputStream is = null;
URLConnection connection = null;
try
{
connection = new URL(url).openConnection();
is = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bitmap = BitmapFactory.decodeStream(bis); //通过decodeStream解析输入流;
is.close();
bis.close();
}catch (IOException e)
{
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) //将从网络上获取的图片显示;
{
super.onPostExecute(bitmap);
progress.setVisibility(View.GONE);
img.setImageBitmap(bitmap);
}
}
}
4、ProgressActivity的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp"
android:gravity="center"
>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
/>
</LinearLayout>
ProgressActivity类的实现代码:
public class ProgressActivity extends Activity
{
ProgressBar progressBar;
MyAsyncTask task;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.progress_layout);
progressBar = (ProgressBar)findViewById(R.id.progressBar);
task = new MyAsyncTask();
task.execute();
}
//重写onPause方法(不写的话,点击按钮开始进度条加载,按返回键返回,再点击按钮后,会发现要过一会儿才开始加载,这是因为之前的一个进度条还没有加载完的原因);
@Override
protected void onPause()
{
super.onPause();
if(task != null && task.getStatus() == AsyncTask.Status.RUNNING) //task不为空且在运行的状态时;
{
//cancel方法只是将对应的AsyncTask标记为true状态,并不是将进度条的加载取消;
task.cancel(true);
}
}
class MyAsyncTask extends AsyncTask<Void, Integer, Void>
{
@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;
}
@Override
protected void onProgressUpdate(Integer... values)
{
super.onProgressUpdate(values);
if(isCancelled())
{
return;
}
progressBar.setProgress(values[0]);
}
}
}
5、最后别忘了在AndroidMainFest.xml文件中进行INTERNET权限的声明和活动的注册;
AsyncTask 网络加载图片及进度条的加载示例的源代码:http://download.csdn.net/detail/baidu_32731497/9454187