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:
3、ImageLoad类的布局:
ImageLoad类的实现代码:
4、ProgressActivity的布局:
ProgressActivity类的实现代码:
5、最后别忘了在AndroidMainFest.xml文件中进行INTERNET权限的声明和活动的注册;
AsyncTask 网络加载图片及进度条的加载示例的源代码:http://download.csdn.net/detail/baidu_32731497/9454187
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
相关文章推荐
- Android studio添加httpclient的jar包
- 树莓派应用之家庭网络中部署一台可在公网提供服务的低功耗服务器
- 安卓第七天笔记--网络编程一
- https握手过程
- ios企业账号发布,没有https服务器解决方案
- AFNetworking网络监听
- 实现TCP连接的AT指令
- 厦门巨游网络科技有限公司(HOTPOWER)承接游戏UI外包
- Genymotion无法创建虚拟机提示: HTTP status code 0
- Xcode7 网络请求报错:The resource could not be loaded because the App Transport Security policy...
- HTTP无状态协议分析与Cookie的关系
- Windows开启网络对时方法
- Linux下网络流量实时监控工具 大全
- springMVC前端请求找不到资源路径(HTTP Status 404)问题
- 【网络流】poj1087
- 网络多线程(pthread , NSThread,GCD ,NSOperation)
- Http 请求
- AsyncHttpClient
- httpurlconnection
- okhttp