您的位置:首页 > 其它

AsyncTask的简单用法和实例

2016-01-26 21:27 387 查看
[code]实例:从网络上下载一个图片,然后放到ImageView中,是用AsyncTask来实现的,本身逻辑也很简单,仅是在doInBackground中用HTTP请求把图片的输入流取出,然后用BitmapFactory去解析,然后再把得到的Bitmap放到ImageView中。

需要深入了解的可以参考:http://blog.csdn.net/hitlion2008/article/details/7983449
特别注意增加增加网络权限。。。。


MainActivity.java

[code]package com.example.day07_homework_asynctask;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
/**
 * 异步任务显示图片
 * 特别注意:从网络下载图片需要开启网络权限
 */
public class MainActivity extends Activity implements OnClickListener{
    private Button button;
    private ImageView imageView;
    String path="https://www.baidu.com/img/bd_logo1.png";//网络上的图片资源
    ProgressDialog progressDialog;//声明进度条组件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化组件
        initView();

    }
    private void initView() {
        button =(Button) findViewById(R.id.button);
        imageView=(ImageView) findViewById(R.id.imageView);
        //给button设置监听
        button.setOnClickListener(this);
        //创建进度条组件
        progressDialog=new ProgressDialog(this);
        progressDialog.setTitle("正在加载");
        //设置进度条标题图片
        progressDialog.setIcon(R.drawable.ic_launcher);
        //设置进度条显示内容
        progressDialog.setMessage("玩命加载中...");
        //设置进度条样式(环形或条形),本例为了显示百分比,使用进度条(环形没有百分比之说)
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    }
    /**
     * 主线程不能直接连接网路,需要子线程从网络获取数据,然后以io形式穿给主线程
     * @author Administrator
     *注意三个参数
     * class MyTask extends AsyncTask<Params, Progress, Result> 
     * “启动任务执行的输入参数”
     * “后台任务执行的进度”--》一般使用Integer
     * “后台计算结果的类型”
     *  从网路下载图片,使用byte[]数组
     */
    class MyTask extends AsyncTask<String, Integer, byte[]>{

        /**
         * 显示进度条(环)
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog.show();
        }

        //注意doInBackground返回的值传给了onPostExecute去更新ui
        @Override
        protected byte[] doInBackground(String... params) {
            //可变长参数,传来的是path网址
            String iamge_path =params[0];
            URL url =null;
            InputStream inputStream = null;
            Byte[]result =null;
            try {
                url =new URL(iamge_path);
                HttpURLConnection conn=(HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.connect();

                if(conn.getResponseCode()==200){
                    int len =0;
                    inputStream =conn.getInputStream();
                    ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
                    int length =0;
                    //获取文件的总长度,为显示进度条做准备,注意只有进度条才可以显示百分比,环形不可以
                    int filelength=conn.getContentLength();
                    byte [] buffer =new byte[1024];
                    //循环读入网络传下来的数据
                    while((len=inputStream.read(buffer))!=-1){
                        //获取读取了的文件长度,为进度条更新时使用
                        length+=len;
                        int progess =(int) ((length/(float)filelength)*100);
                        publishProgress(progess);
                        //将buffer中的数据读入byteArrayOutputStream
                        byteArrayOutputStream.write(buffer,0,len);
                        //防止速度过快,为了看清进度条,加延时
                        Thread.sleep(1000);
                    }
                    //返回值byte数组,给onPostExcute更新ui
                    return byteArrayOutputStream.toByteArray();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }
        //更新进度条(环)
        //在重写方法时,注意一定将类的参数填好之后再重写,避免出错
        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
            //可变长参数,注意
            int progress_values=values[0];
            //更新进度条(环)
            progressDialog.setProgress(progress_values);
        }
//      数据上穿后,更新ui界面
        @Override
        protected void onPostExecute(byte[] result) {
            super.onPostExecute(result);
            //数据上穿完成后,进度条(环)销毁
            progressDialog.dismiss();
            //bitmap的使用,将字节数组
            Bitmap bm=BitmapFactory.decodeByteArray(result,0,result.length);
            imageView.setImageBitmap(bm);
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button:
            //异步任务启动
            new MyTask().execute(path);
            break;
        default:
            break;
        }
    }
}


布局文件:

[code]<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:layout_gravity="center_vertical">

    <Button
        android:layout_gravity="center"
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="异步任务下载图片" />
    <ImageView
    android:id="@+id/imageView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: