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


案例描述:

通过一个固定的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;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.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" />

    <application
		android: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>


效果图:











  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值