AsyncTask案例——异步加载一张图片并显示进度条

来源:互联网 发布:淘宝客服泄露买家信息 编辑:程序博客网 时间:2024/05/18 00:23


案例描述:

通过一个固定的URL连接,从网上加载图片,并最后形成Bitmap显示在ImageView上,

同时在加载的过程中,显示一个进度条,加载完毕后关掉进度条,显示图片。


(1)main_layout.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:orientation="vertical" >    <ImageView        android:id="@+id/image"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <ProgressBar        android:id="@+id/progressbar"        style="?android:attr/progressBarStyleHorizontal"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true"        android:visibility="gone" /></RelativeLayout>

(2)MainActivity.java文件:

package mMainActivity;import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import com.test.asynctaskdemoxiao.R;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.ImageView;import android.widget.ProgressBar;public class MainActivity extends Activity{private ImageView mImageView;private ProgressBar mProgressBar;private static String url = "http://img0.imgtn.bdimg.com/it/u=1070902365,2619384777&fm=21&gp=0.jpg";  private MyAsycTask mTesk;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main_layout);mImageView = (ImageView) findViewById(R.id.image);mProgressBar = (ProgressBar) findViewById(R.id.progressbar);// 通过MyAsycTask的execute就可以开启异步线程操作,          // 在execute方法中传进去一个或多个参数作为下面String... params的参数。          mTesk = new MyAsycTask();        mTesk.execute(url); }/*      * 在Activity执行onPause生命周期时,我们对AsyncTask进行判断,      *       * */      @Override      protected void onPause() {          // TODO Auto-generated method stub          super.onPause();          // 当不为空且Running:          if(mTesk != null && mTesk.getStatus() == AsyncTask.Status.RUNNING){              // cancel方法只是将对应的AsyncTask标记为cancel状态,并不是真正的取消线程的执行。              mTesk.cancel(true);          }      }            /*      * 创建内部类 MyAsycTask:     * 三个参数<url类型,进度值类型,返回值类型>      * */      class MyAsycTask extends AsyncTask<String, Integer, Bitmap>{            /*          * 在doInBackground方法之前先执行onPreExecute方法:          * 异步操作的初始化操作。          * */          @Override          protected void onPreExecute() {              super.onPreExecute();              // 将ProgressBar显示出来:              mProgressBar.setVisibility(View.VISIBLE);          }  /*          * 真正的异步操作处理          * */          @Override          protected Bitmap doInBackground(String... params) {              // 第一步:获取传递进来的参数              // String... params代表可变长数组,也就是说我们可以传递不止一个参数进来,              // 由于我们只传进来一个参数,所以取对应的url即可。              String url = params[0];                            Bitmap bitmap = null;              URLConnection connection;              InputStream is; // 用于获取数据的输入流。              try {// 将一个URL对象解析程一个Bitmap对象:                  connection = new URL(url).openConnection(); // 获取网络连接对象                  is = connection.getInputStream();       // 获取输入流                  BufferedInputStream bis = new BufferedInputStream(is);                                    // 模拟整个进度栏的更新:                  for(int i=0; i<100; i++){                      publishProgress(i);     // 这里的这个i值会传给下面onProgressUpdate的values                      try {                          Thread.sleep(300);                      } catch (InterruptedException e) {                          // TODO Auto-generated catch block                          e.printStackTrace();                      }                  }                                   // 第二步:通过decodeStream解析输入流为bitmap对象:                  bitmap = BitmapFactory.decodeStream(bis);                  is.close();     // 关闭输入流                  bis.close();              } catch (MalformedURLException e) {                  e.printStackTrace();              } catch (IOException e) {                  e.printStackTrace();              }              // 将Bitmap作为返回值返回给后面调用的方法(onPostExecute):              return bitmap;          }                    @Override          protected void onProgressUpdate(Integer... values) {               super.onProgressUpdate(values);              // 将进度值传给我们布局中的进度条              mProgressBar.setProgress(values[0]);          }  /*          * 在doInBackground方法之后执行onPostExecute方法:          * 可以在这里操作UI,设置图像,          * */          @Override          protected void onPostExecute(Bitmap result) {              super.onPostExecute(result);              // 取消进度条显示:              mProgressBar.setVisibility(View.GONE);              // 设置图像显示内容:              mImageView.setImageBitmap(result);          }      }  }


(3)Manifest文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.test.asynctaskdemoxiao"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="20" />    <uses-permission android:name="android.permission.INTERNET" />    <applicationandroid:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="mMainActivity.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>


效果图:











1 0
原创粉丝点击