使用AsyncTask下载图片

先要进行一个访问网络的权限获取:

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

1.声明基础组件:分别为一个按钮进行启动下载操作,一个图片资源,一个下载图片的路径,一个进程对话框

 private Button button;
 private ImageView imageView;
 private final String IMAGE_PATH="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
 private ProgressDialog progressDialog;

 
 2.进行对话框的捕捉及设置其显示的内容: 
 

progressDialog=new ProgressDialog(this);
progressDialog.setTitle("提示");
progressDialog.setCancelable(false);//注意这里一定要选为用户不可取消的,这样的话可以保证对话框一直悬浮
progressDialog.setMessage("正在下载");</span>
3.按钮和图片显示框的捕获:

button=(Button)findViewById(R.id.button);
imageView=(ImageView)findViewById(R.id.imageView);</span>
4.声明一个异步任务类:

public class MyTesk extends AsyncTask<String,Integer,byte[]>
    {
        //进行预操作,显示对话框
        protected void onPreExecute(){
            super.onPreExecute();
            progressDialog.show();
        }
        //这是异步任务核心部分,需要进行重写
        @Override
        protected byte[] doInBackground(String... params) {
            //创建HttpClient对象,这里创建的是默认客户端实例
            HttpClient httpClient=new DefaultHttpClient();
            //这里需要进行一个Get请求因此还需要一个HttpGet对象
            HttpGet httpGet=new HttpGet(params[0]);
            byte[] result=null;
            try
            {
                //创建响应对象
                HttpResponse httpResponse=httpClient.execute(httpGet);
                //这里需要查看响应对象的返回值是否为200,如果不是则访问错误
                if(httpResponse.getStatusLine().getStatusCode()==200)
                {
                    /*
                    * EntityUtils对象是org.apache.http.util下的一个工具类,用官方的解释是为HttpEntity对象提供的静态帮助类,其常用的几个方法如下:
                      consume()方法;关闭HttpEntity是的流,如果手动关闭了InputStream instream = entity.getContent();这个流,也可以不调用这个方法。
                      consumeQuietly(HttpEntity)方法
                      toByteArray(final HttpEntity entity)方法
                    * */
                    //这里返回一个数据流
                    result= EntityUtils.toByteArray(httpResponse.getEntity());
                }
            }catch (Exception e)
            {
                e.printStackTrace();
            }
            return result;
        }

        protected void onPostExecute(byte[] result)
        {
            super.onPostExecute(result);
            //使用位图的解码工具BitmapFactory.decodeByteArray解析传回的result
            Bitmap bitmap= BitmapFactory.decodeByteArray(result,0,result.length);
            //显示图片
            imageView.setImageBitmap(bitmap);
            //关闭对话框
            progressDialog.dismiss();
        }
    }
</span>
5.设置按钮的点击事件来启动AsyncTask:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new MyTesk().execute(IMAGE_PATH);
            }
        });
</span>
6.这里简述一下http状态返回代码

* 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。 * 100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 * 101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。http状态返回代码 * 2xx (成功)表示成功处理了请求的状态代码。 * 200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 * 201 (已创建) 请求成功并且服务器创建了新的资源。 * 202 (已接受) 服务器已接受请求,但尚未处理。 * 203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。 * 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。 * 205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。 * 206 (部分内容) 服务器成功处理了部分 GET 请求。http状态返回代码 * 3xx (重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。 * 300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 * 301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。 * 302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 * 303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。 *







你可能感兴趣的:(android,网络,AsyncTask)