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

构建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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值