Android之AsyncTask网络加载图片

来源:互联网 发布:高端是淘宝违禁词吗 编辑:程序博客网 时间:2024/06/05 12:42

最近在学习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="http://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