Android之AsyncTask网络加载图片

最近在学习AsyncTask,先看下AsyncTask的定义:

public abstract class AsyncTask<Params, Progress, Result>
Params-启动任务时执行的输入参数。

Progress-后台任务执行的进度。

Result-任务结束后所返回的结果。

并不是所有的参数都会被用到,如果没有用到则用Void代替。

AsyncTask 主要有如下方法:

execute((Params... params)方法:启动AsyncTask。要在UI线程中执行

四大方法:
onPreExecute()方法;第一个执行的方法
doInBackground(Params... params)方法:执行完onPreExecute()方法后便开始执行,耗时操作都在这里执行。并返回计算结果
onProgressUpdate(Progress... values)方法:与doInBackground(Params... params)方法一起执行,并将进度更新到UI组件中。
onPostExecute(Result result)方法:当doInBackground(Params... params)方法执行完后便开始执行。得到doInBackground(Params... params)方法返回的计算结果,在此方法中与UI线程中交互。
以上四个方法不能手动调用。
doInBackground(Params... params)方法不能与UI进行交互

开始AsyncTask网络加载图片实例:

package com.example.kira.newasycndemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class MainActivity extends AppCompatActivity {
    private ProgressBar mprogressBar;
    private ImageView imageView;
    private static String URL="https://img-my.csdn.net/uploads/201504/12/1428806103_9476.png";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.image);
        mprogressBar= (ProgressBar) findViewById(R.id.pb);
        imageView= (ImageView) findViewById(R.id.image);
        MyAsycnTask my=new MyAsycnTask(MainActivity.this,imageView,mprogressBar);
        my.execute(URL);
    }
}


MyAsycnTask类:
<pre name="code" class="java">package com.example.kira.newasycndemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;

import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Created by Kira on 2016/9/24.
 */
public class MyAsycnTask extends AsyncTask<String,Void,Bitmap> { 
//String-传入的地址是String类型的,Void-不需要看到后台任务的执行程度,故为Void, Bitmap-最后返回一个Bitmap类型。
    private Context context;
    private ImageView img;
    private ProgressBar progressBar;
    MyAsycnTask(Context context, ImageView img, ProgressBar progressBar)
    {
        this.context=context;
        this.img=img;
        this.progressBar=progressBar;
    }
    @Override
    protected Bitmap doInBackground(String... params) {//String... params代表可以传入多个参数进来
        Log.i("=====","doInBackground");
        String url=params[0];//因为只有一个参数传进来,所以直接params[0],将第一个参数取出来即可。
        try {
            URL u=new URL(url);
            HttpURLConnection conn= (HttpURLConnection) u.openConnection();//打开链接
            conn.setRequestMethod("GET"); //设置请求方法
            conn.setReadTimeout(5*1000); //设置延迟时间
            InputStream is = null;    //创建输入流
           int code= conn.getResponseCode();
            if (code==200)
            {
                is=conn.getInputStream(); //获取输入流
                BufferedInputStream bis=new BufferedInputStream(is); //创建缓冲区,提高效率。
                Thread.sleep(5*1000);//让线程进行休眠,方便看到进度条更新。
                Bitmap bitmap= BitmapFactory.decodeStream(bis); //获得Bitmap

                is.close();
                bis.close();
                return bitmap;
            }



        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPreExecute() {
        Log.i("=====","onPreExecute");
        super.onPreExecute();
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        Log.i("=====","onPostExecute");
        super.onPostExecute(bitmap);
        img.setImageBitmap(bitmap);
        progressBar.setVisibility(View.GONE);
    }
}


 布局文件: 

image.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:padding="10dp">

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <ProgressBar
        android:id="@+id/pb"

        android:layout_width="90dp"
        android:layout_height="90dp"
        android:visibility="gone"
        android:layout_centerInParent="true"/>
</RelativeLayout>
记得在AndroidManifest中获取网络权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值