您的位置:首页 > 理论基础 > 计算机网络

AsyncTask 网络加载图片及进度条的加载示例

2016-03-07 00:31 429 查看
构建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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: